Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 将bigint转换为datetime_Sql_Sql Server_Tsql_Teamcity - Fatal编程技术网

Sql 将bigint转换为datetime

Sql 将bigint转换为datetime,sql,sql-server,tsql,teamcity,Sql,Sql Server,Tsql,Teamcity,我想将一个值从bigint转换为datetime 例如,我正在阅读teamcity server的历史记录表。在字段build\u start\u time\u server中,我在一条记录1283174502729上有这个值 如何将其转换为日期时间值?这对您有用吗?在SQL Server 2005上,此时返回30-8-2010 13:21:42: select dateadd(s, convert(bigint, 1283174502729) / 1000, convert(datetime,

我想将一个值从bigint转换为datetime

例如,我正在阅读teamcity server的历史记录表。在字段build\u start\u time\u server中,我在一条记录1283174502729上有这个值


如何将其转换为日期时间值?

这对您有用吗?在SQL Server 2005上,此时返回30-8-2010 13:21:42:

select dateadd(s, convert(bigint, 1283174502729) / 1000, convert(datetime, '1-1-1970 00:00:00'))

我已经除以1000,因为dateadd函数不能处理这么大的数字。因此,您确实会损失一点精度,但使用起来要简单得多。

略微不同的方法:

您的场景:

SELECT dateadd(ms, 1283174502729 / 86400000, (1283174502729 / 86400000) + 25567)
FROM yourtable
通用代码:

SELECT dateadd(ms, yourfield / 86400000, (yourfield / 86400000) + 25567)
FROM yourtable
输出:

August, 30 2010 00:00:14

SQL FIDLE:

以下内容考虑了新的SQL术语,并将返回毫秒(也可以修改以用于计算字段)。[SQL Server 2012或更高版本]

declare @StartDate datetime2(3) = '1970-01-01 00:00:00.000'
, @milliseconds bigint = 1283174502729
, @MillisecondsPerDay int = 60 * 60 * 24 * 1000 -- = 86400000

SELECT  DATEADD(MILLISECOND, TRY_CAST(@milliseconds % @millisecondsPerDay AS 
INT), DATEADD(DAY, TRY_CAST(@milliseconds / @millisecondsPerDay AS INT), 
@StartDate));

您是否尝试过使用\u UNIXTIME

select from_unixtime('your_field') from 'your_table'


适合我。

我更改了标签,希望能让它们更具体。请注意,如果在标记字段中使用“sql server”,这将位于sql标记和服务器标记下,但不在sql server标记下,这可能是您想要的。您想要1283174502729的日期时间值是多少?同意@krock。由于您的问题并不特定于您想要什么样的SQL实现(例如:SQL server),因此这里有许多答案并不适用,具体取决于SQL.down的风格。“将表达式转换为数据类型int时出现算术溢出错误。”使用问题中提供的数据。不过,稍加调整就可以了,也许海报可以解决一点问题?(向上投票鼓励他:)我还是不明白投票被否决了。有错误吗?这适用于2008R2。效率低吗?如果我不知道要改进什么,我该如何改进呢?我可以想象,否决票是因为提供了一个只使用代码的答案,而没有解释它在做什么或它为什么工作。
declare @StartDate datetime2(3) = '1970-01-01 00:00:00.000'
, @milliseconds bigint = 1283174502729
, @MillisecondsPerDay int = 60 * 60 * 24 * 1000 -- = 86400000

SELECT  DATEADD(MILLISECOND, TRY_CAST(@milliseconds % @millisecondsPerDay AS 
INT), DATEADD(DAY, TRY_CAST(@milliseconds / @millisecondsPerDay AS INT), 
@StartDate));
select from_unixtime('your_field') from 'your_table'