SQL Server中bigint的小时格式的日期差异

时间:2014-11-20 06:15:17

标签: sql-server-2008 datetime datediff bigint date-difference

我有bigint类型的列,其中包含日期&时间信息(例如135305651513530670401360839600等。)

我的要求是在上面提到的列与当前日期时间之间获得HOURS格式的时差。

我试图找到解决方案,但那些令人困惑。我是SQL Server的新手。

请帮忙。

2 个答案:

答案 0 :(得分:1)

请试一试。

declare @mydate datetime
DECLARE @LocalTimeOffset BIGINT
  ,@AdjustedLocalDatetime BIGINT

SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
SET @AdjustedLocalDatetime = 1416474000 - @LocalTimeOffset

SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime))
-- It will give you date 2014-11-20 14:30:00.000

数据差异操作:

select DATEDIFF(hour,@mydate,GETDATE())

创建功能

create  FUNCTION dbo.fn_ConvertToDateTime (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
  DECLARE @mydate datetime
  DECLARE @LocalTimeOffset BIGINT
           ,@AdjustedLocalDatetime BIGINT

  SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
  SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset
  SELECT @mydate=DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime))
  return @mydate
END;
GO

select mydate= dbo.fn_ConvertToDateTime (1416474000)

select DATEDIFF(hour,@mydate,GETDATE())

希望有所帮助。

答案 1 :(得分:0)

该数字看起来像UNIX时间戳,这是自UTC时间1/1/1970 00:00:00以来的秒数。您可以使用简单的DATEDIFF从datetime获取UNIX时间戳:

declare @date datetime='2014-11-20T10:00:00'
declare @epoch datetime='19700101'

select DATEDIFF(s,@epoch,@date)

要获得两个时间戳之间的小时数,您只需将差值除以3600(一小时内的秒数)。在计算差异之前,您无需将时间戳转换为日期:

declare @dateTS int=DATEDIFF(s,@epoch,@date)
declare @nowTS int=DATEDIFF(s,@epoch,GETUTCDATE())

select (@nowTS-@dateTS)/3600.0

请注意,我使用3600.0来获取小数结果。如果使用3600,则小数部分将被截断,并且对于小于1小时的差异,您将获得0。如果您想要返回整个小时,这是可以的。

在查询中,您可以编写如下内容:

select (DATEDIFF(s,@epoch,GETUTCDATE())-[MY_TS_COLUMN])/3600.0 AS Hours
from [MY_TABLE]