Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server日期时间到bigint(历元)溢出_Sql Server_Datetime - Fatal编程技术网

Sql server SQL Server日期时间到bigint(历元)溢出

Sql server SQL Server日期时间到bigint(历元)溢出,sql-server,datetime,Sql Server,Datetime,我有一个值为2013-03-22 15:19:02.000的“datetime”列 我需要将该值转换为历元时间,并将其存储在“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

我有一个值为2013-03-22 15:19:02.000的“datetime”列

我需要将该值转换为历元时间,并将其存储在“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')
我知道

信息535,16级,状态0,第1行 datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用

如何从'datetime'字段中获取准确的历元值


我使用SQLServer2008。这也适用于2005年。

这里有一个示例,未经测试,是用手写的:)

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


当尝试获取精确的毫秒数时,我们得到溢出异常。我们可以得到几秒钟的数值,然后乘以1000

这相当于javascript中的
new 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
使用以下语句将历元转换为人类可读的日期时间:

select DATEADD(s, 1481300537, '1970-01-01 00:00:00')
纪元到日期时间

create function [dbo].[EpochToDate](@Date bigint)
returns datetime
begin
    return (select dateadd(s, @Date, '19700101'))
end 

使用下面的代码从历元时间获取人类可读的日期

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

你的约会时间在哪个时区?看起来离格林尼治标准时间还有几个半小时。也许在印度?(我想知道SQL Server是否可能在1970-01-01的时区中使用GMT,因为它没有那么久远的时区信息,也没有2013年的本地时区。)你说你希望它以历元值=unix时间表示,也就是以秒为单位,那么为什么要在第二次查询中以毫秒为单位查询差异?@MattGibson India ISTHrm。出于好奇,
selectdatediff(s'1970-01-01 00:00:00Z'、'2013-03-22 15:19:02Z')
给了你什么?(使用Z应根据GMT而不是datetime生成datetimeoffset。)@aweis I应将其存储在毫扇区中。此操作还返回1363965542000I我尝试将上的整数值转换为,1363945741898计算为Fri,2013年3月22日格林威治标准时间09:49:01所以我不确定你是如何计算你的价值的,因为你得到它到2013年3月22日15:19:02.000在我的时区是,3月22日,星期五,2013年3:19:01 PM GMT+5.5我在答案中添加了一个示例,我在GMT和IST之间来回转换。在您的第一个代码块中,我在计算毫秒之前从秒数中减去了19800。它给出了正确的结果。谢谢。最后一条语句的结果是:
将表达式转换为数据类型int时出现算术溢出错误。
如果您有更大的日期。
create function [dbo].[EpochToDate](@Date bigint)
returns datetime
begin
    return (select dateadd(s, @Date, '19700101'))
end 
select DATEADD(s,convert(bigint,@date)/2, DATEADD(s, convert(bigint,@date)/2, '1970-01-01 00:00:00'))