2013-03-26 100 views
4

我有值“日期时间”列2013年3月22日15:19:02.000SQL Server日期时间为bigint(时代)溢出

我需要这个值转换为划时代的时间,并将其存储在一个“ BIGINT”字段

用于上述时间的实际元值是,

当我使用

select DATEDIFF(s, '1970-01-01 00:00:00', '2013-03-22 15:19:02.000') 

我得到的,

当我使用

select DATEDIFF(ms, '1970-01-01 00:00:00', '2013-03-22 15:19:02.000') 

我得到的,

消息535,级别16,状态0,第1行 DateDiff函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用不精确的日期部分的datediff。

如何从“日期时间”领域得到确切的时代价值

我使用SQL Server 2008.此外,应与2005年

谢谢合作。

+0

什么时区的日期时间是?距离格林威治标准时间还有几个半小时。也许在印度?(我想知道如果SQL Server可能使用GMT时区作为1970-01-01的时区,因为它没有时区信息可以追溯到那么远,并且您的本地时区为2013.) – 2013-03-26 10:37:07

+2

你说你想要它在时代值= unix时间,并且以秒为单位,那么为什么您要查询第二个查询中以毫秒为单位的差异? – aweis 2013-03-26 10:38:19

+0

@MattGibson印度IST – itsraja 2013-03-26 10:40:20

回答

2

下面是一个例子,而不是测试,从自由手写:)

declare @v_Date datetime 
set @v_Date = '2013-03-22 15:19:02.000' 

declare @v_DiffInSeconds integer 
declare @v_DiffInMSeconds bigint 

select @v_DiffInSeconds = DATEDIFF(s, '1970-01-01 00:00:00', @v_Date) 
select @v_DiffInMSeconds = cast(@v_DiffInSeconds as bigint) * 1000 + cast(DATEPART(ms, @v_Date) as bigint) 

编辑 我已低于此的例子来说明的时区转换。给定的时间戳(以秒为单位,我已经删除了最后三位数字“898”)通过增加5.5小时(19800秒)转换为本地IST时区,并将其从本地时间转换回时间戳GMT再次。以下计算与问题中的值相匹配(以秒为单位)。

declare @v_time datetime 
set @v_time = '1970-01-01 00:00:00' 

declare @v_date datetime 
set @v_date = '2013-03-22 15:19:01' 

-- This returns "March, 22 2013 15:19:01" 
select dateadd(s, (1363945741 + 19800), @v_time) 

-- This returns "1363945741" 
select datediff(s, @v_time, @v_date) - 19800 
+0

这也返回1363965542000 – itsraja 2013-03-26 12:37:15

+0

我试图转换http://www.epochconverter.com/上的整数值和1363945741898被评估为星期五,2013年3月22日09:49:01 GMT所以我不知道你是如何计算你的价值,因为你得到它2013-03-22 15:19:02 .000 – aweis 2013-03-26 16:24:55

+0

在我的时区它是,2013年3月22日,星期五3: 19:01 PM GMT + 5.5 – itsraja 2013-03-27 05:30:49

0

当试图得到确切的毫秒时,我们得到了溢出异常。我们可以在javascript得到的值,直到秒,与1000

这等同于新的日期乘()的getTime():

使用下面的语句获取在几秒钟的时间。

SELECT cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-09 16:22:17.897') as bigint) 

使用下面的语句来获取以毫秒为单位的时间。

SELECT cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-09 16:22:17.897') as bigint) * 1000 

转换时期使用下面的语句人类可读的日期时间:

select DATEADD(s, 1481300537, '1970-01-01 00:00:00') 
+0

最后一条语句的结果是:'如果日期较大,则算术溢出错误将表达式转换为数据类型int.'。 – FatAlbert 2017-12-19 10:17:02