Date SQL插入unix时间戳(毫秒)

Date SQL插入unix时间戳(毫秒),date,sql-server-2008-r2,Date,Sql Server 2008 R2,unix时间戳是否可以包含时间的毫秒值 如果是,请使用SQL Server 2008 R2: CREATE TABLE [dbo].[my_table_calls_log] ( [id] [bigint] IDENTITY(1,1) NOT NULL, [requestdate] [bigint] NULL, [partycode] [bigint] NULL, CONSTRAINT [PK_my_table_calls_log] PRIMARY KE

unix时间戳是否可以包含时间的毫秒值

如果是,请使用SQL Server 2008 R2:

CREATE TABLE [dbo].[my_table_calls_log]
(
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [requestdate] [bigint] NULL,
    [partycode] [bigint] NULL,

    CONSTRAINT [PK_my_table_calls_log] 
    PRIMARY KEY CLUSTERED ([id] ASC)
)
以下选择以毫秒为单位给出当前日期和时间:

SELECT CONVERT(VARCHAR,SYSDATETIME(),121);
例如:

2015-09-11 13:29:02.8239061
如何将长YYYY-MM-DD HH:MM:SS.MS日期/时间值转换为unix时间戳,以便使用以下方式插入它:

DECLARE @UnixDate AS bigint;

SET @UnixDate = "the unix timestamp equivalent of SELECT CONVERT(VARCHAR,SYSDATETIME(),121);"

INSERT INTO my_table_calls_log (requestdate,partycode)
VALUES (@UnixDate,123);

标准unix时间戳是精度为1秒的32位有符号整数(请参阅),也就是说,如果您选择使用64位整数和毫秒精度(只要您确定将使用/使用该时间戳值的所有代码都知道该约束),那么使用64位整数和毫秒精度肯定没有什么无效的。大多数标准的unix时间戳库都假定它是1秒精度,如果传递的是64位有符号整数而不是仍然有效的32位整数,并且假定用户只是在计划延长时间戳的使用寿命(即跟踪2038年1月19日之后的日期/时间值,该日期是基于32位的unix时间戳由于溢出而在默认历元的某个点停止工作的日期)

Unix时间戳通常也假定基本纪元为“1970-01-01 00:00:00”,因此使用该假定,您可以使用以下内容将标准SQL Server datetime值转换为unixtimestamp:

select datediff(second, '1970-01-01T00:00:00.000', sysdatetime());
如果您希望它是基于毫秒的,那么它会变得有点复杂,因为SQL Server中的datediff函数是基于32位整数的(即int数据类型),并且默认历元和当前日期/时间(以毫秒为单位)之间的差值超过了该类型的上限,因此我们必须有点创造性,这里有一个选项(我倾向于使用包装在函数中的):

在每个示例中,如果您有一个基于varchar/字符的日期/时间值,只需直接插入脚本中,以代替我使用的sysdatetime()函数

declare @start datetime2 = '1970-01-01T00:00:00.000',
        @end datetime2 = sysdatetime(),
        @ms_in_day bigint = 60 * 60 * 24 * 1000;

select  (@ms_in_day * datediff(day, @start, @end)) - datediff(millisecond, @end, cast(@end as date));