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);
答案 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()函数。