SQL插入unix时间戳以毫秒为单位

时间:2015-09-11 11:56:19

标签: 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 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);

1 个答案:

答案 0 :(得分:1)

标准unix时间戳是32位有符号整数,精度为1秒(参见here),表示使用64位整数并使用毫秒精度无效选择(只要您确定将使用/使用该时间戳值的所有代码都知道该约束)。大多数标准的unix时间戳库假设它是1秒精度,如果你传递一个64位有符号整数而不是仍然保持的32位整数,并且假设用户只是计划更长的时间戳(即跟踪2038年1月19日之后的日期/时间值,这是一个基于32位的unix时间戳将因默认时期因溢出而停止工作的日期。

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

select datediff(second, '1970-01-01T00:00:00.000', sysdatetime());

如果你希望它基于毫秒,它变得有点复杂,因为SQL Server中的datediff函数是基于32位整数(即int数据类型)和默认纪元与当前日期之间的差异/以毫秒为单位的时间超过了该类型的上限,因此我们必须获得一点创意,这里有一个选项(我倾向于将其包含在函数中):

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));

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