3

我尝试了许多将 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 的算术溢出错误。”

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

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

4

3 回答 3

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
于 2013-05-24T06:06:35.877 回答
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
于 2014-05-09T17:41:04.597 回答
0

根据MSDN,语法是:

DATEADD (datepart , number , date )

其中 number 是一个表达式,可以解析int为添加到 date 的 datepart 的表达式。用户定义的变量是有效的。

此外,对于 datepartmicrosecondnanoseconddate 数据类型smalldatetimedate和的添加datetime不允许的。

尝试这个 :

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

SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
于 2013-05-24T06:01:41.843 回答