sql server datetime到bigint(epoch)溢出

时间:2013-03-26 10:32:37

标签: sql-server datetime

我有一个'datetime'列,其值为2013-03-22 15:19:02.000

我需要将此值转换为纪元时间并将其存储在'bigint'字段

上述时间的实际纪元值是,

1363945741898

当我使用

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

我明白了,

1363965542

当我使用

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

我明白了,

Msg 535,Level 16,State 0,Line 1 日期函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用具有不太精确的日期部分的datediff。

如何从'datetime'字段中获取确切的纪元值

我使用的是sql server 2008.这也适用于2005年。

感谢。

4 个答案:

答案 0 :(得分:6)

这是一个未经测试的例子,是从空闲的手写的:)

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

答案 1 :(得分:0)

当试图获得精确的毫秒时,我们得到溢出异常。我们可以得到值到秒并乘以1000。

这相当于javascript中的新Date()。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

使用以下语句将epoch转换为人类可读日期时间:

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

答案 2 :(得分:0)

升级到日期时间

创建函数[dbo]。[Ep​​ochToDate](@ Date bigint) 返回日期时间

开始 返回(选择dateadd(s,@Date,'19700101')) 结束

答案 3 :(得分:0)

使用以下代码从时代开始获取人类可读的日期

select DATEADD(s,convert(bigint,@date)/2, DATEADD(s, convert(bigint,@date)/2, '1970-01-01 00:00:00'))