Отличие даты в формате Часы от bigint в SQL Server

У меня есть колонка bigint тип, содержащий информацию о дате и времени (например, 1353056515, 1353067040, 1360839600 так далее.)

Мое требование - получить разницу во времени в формате ЧАСОВ между колонкой, о которой я упоминал выше, и текущей датой-временем.

Я пытался найти решение, но это было так запутанно. Я новичок в SQL Server.

Пожалуйста помоги.

2 ответа

Решение

Пожалуйста, попробуйте это.

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())

Надеюсь, это поможет.

Число выглядит как метка времени UNIX, то есть количество секунд с 01.01.1970 00:00:00 UTC. Вы можете получить метку времени UNIX от datetime с простым DATEDIFF:

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 используется дробная часть будет усечена, и вы получите 0 для различий менее 1 часа. Это нормально, если вы хотите вернуться целые часы.

В запросе вы можете написать что-то вроде этого:

select (DATEDIFF(s,@epoch,GETUTCDATE())-[MY_TS_COLUMN])/3600.0 AS Hours
from [MY_TABLE]
Другие вопросы по тегам