Отличие даты в формате Часы от 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]