当epoch超过一万亿秒时,错误将Epoch转换为SQL Server中的DateTime

时间:2013-05-24 05:29:33

标签: sql-server datetime epoch

我尝试了许多用于将EPOCH转换为SQL Server日期时间的答案。它们在EPOCH达到十亿秒时工作。但是一旦它超过万亿大关,它就会破灭!例如。 - >

1. SELECT dateadd(MCS,1351187877744,'1970-01-01')
2. SELECT dateadd(NS,1351187877744,'1970-01-01')
3. SELECT dateadd(NANOSECOND, 1351187877744, '1970-01-01 00:00:00.0000000')
4. SELECT convert(bigint, datediff(ss, '01-01-1970 00:00:00',1351187877744))

以上所有失败都出现以下溢出错误: “将表达式转换为数据类型int的算术溢出错误。”

有趣的是,当我在this site输入此日期时,它会返回正确的值。

任何建议如何以适用于任何规模(>万亿秒等)的EPOCH的方式执行此操作

3 个答案:

答案 0 :(得分:3)

试试这个 -

MSDN:

DATEADD: number参数不能超过int的范围。在以下语句中,number的参数超出int的范围1.返回以下错误消息:" 消息8115,级别16,状态2,行1.算术溢出错误将表达式转换为数据输入int。"

<强>查询:

DECLARE 
      @Date DATETIME = '19700101'
    , @MaxInt INT = 2147483647 
    , @ms BIGINT = 1351187877744

WHILE @ms != 0 BEGIN

    SELECT @Date = DATEADD(ms, CASE WHEN @ms > @MaxInt THEN @MaxInt ELSE @ms END, @Date)
    SELECT @ms = CASE WHEN @ms - @MaxInt < 0 THEN 0 ELSE @ms - @MaxInt END

END

SELECT @Date

<强>输出:

2012-10-25 17:57:57.533

答案 1 :(得分:2)

只需创建此功能

CREATE FUNCTION convertEpoch 
(@epochVal bigint) RETURNS datetime 
AS BEGIN DECLARE @Return datetime
SELECT @return = dateadd(s,@epochVal/1000,'1970-01-01')
RETURN @return END

答案 2 :(得分:0)

根据MSDN,语法为:

DATEADD (datepart , number , date )

,其中 表达式是否可以解析为添加到日期日期部分的int。用户定义的变量有效。

另外, 日期数据类型microsecondnanosecondsmalldatetime的日期部分datedatetime的添加不允许。< / p>

试试这个:

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';

SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)