Як я можу конвертувати bigint (UNIX часова мітка) у timetime в SQL Server?


Відповіді:


57

спробуйте:

CREATE FUNCTION dbo.fn_ConvertToDateTime (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
    DECLARE @LocalTimeOffset BIGINT
           ,@AdjustedLocalDatetime BIGINT;
    SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
    SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset
    RETURN (SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime)))
END;
GO

2
+1 Для UTC-> локальної конверсії. Зауважте, що літо / зимовий час все одно буде вимкнено, якщо спробувати перекласти 10 червня протягом лютого.
Андомар

11
-1 для UTC-> локальної конверсії. Це неправильно поводження з літнім часом. Для мене це помилково.
Павло Горал

+1 за креативне рішення! Чудово працює. FYI, в SQL є синтаксична помилка. Напіву двокрапку в кінці першого рядка "ДЕКЛАРАЦІЯ" потрібно видалити, оскільки наступна кома.
Сет

2
Це не працює для мене. Я пробую це з 1517270400000 і отримую цю помилку: Арифметична помилка переповнення перетворює вираз у тип даних int.
Датський

1
Також отримували переповнення, що означає, що задіяні мілісекунди, вирішується просто так: виберіть dbo.fn_ConvertToDateTime (src_column / 1000) від src_table;
access_granted

304

Це працювало для мене:

Select
    dateadd(S, [unixtime], '1970-01-01')
From [Table]

Якщо хтось задається питанням, чому 1970-01-01, це називається епоховим часом .

Нижче наведено цитату з Вікіпедії:

Кількість секунд, що минули з 00:00:00 Універсальний координований час (UTC), четвер, 1 січня 1970 р., [1] [примітка 1], не рахуючи високосних секунд.


17
Це слід позначити як правильне. Я б хотів, щоб я міг повторити цю відповідь кожен раз, коли я
приземлююся

2
@BenDundee Я дуже з тобою згоден. Яке елегантне рішення. Я роздивився всю формулу і, нарешті, зупинився на одній лише для того, щоб знову знову шукати, коли через тиждень я почав стикатися з помилками. На щастя, я знайшов цього на другому обході.
Лопшировано

1
Я використовую це рішення. Ця відформатована дата була з'єднана з іншими даними, тому у мене був варчар ... Легко! Немає необхідності форматувати ці журнали в додатку. Однак з’явилися деякі проблеми дикого часового поясу! Мої дати використовували часовий пояс UTC замість часового поясу клієнта :(
gustavohenke

2
@Whitecat Не знаю, чи ви вже вирішили свою проблему, але стежте за корпусом! Можливо, у вашому налаштуванні зіставлення бази даних встановлено щось на зразок "SQL_Latin1_General_CP1_CS_AS", тут є ключове слово. Він розшифровується як "CaseSensitiv", тому ваш код повинен відповідати корпусу! Іншим моментом може бути те, що ваша система MySql, ніж ім'я date_add (). З повагою;)
Ніч

3
На це рішення вплине проблема 2038 року, оскільки для функції додавання дат потрібен тип int. У документації написано: "Аргумент числа не може перевищувати діапазон int." docs.microsoft.com/en-us/sql/t-sql/functions/… en.wikipedia.org/wiki/Year_2038_problem
Patrick H

30

Якщо хтось потрапляє нижче помилки:

Арифметична помилка переповнення перетворення виразу в тип даних int

завдяки часовій позначці unix знаходиться в bigint (замість int), ви можете використовувати це:

SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01')
FROM TABLE

Замініть жорстку кодову позначку для фактичного стовпця на unix-часову позначку

Джерело: MSSQL bigint Unix Timestamp to Datetime з мілісекундами


З урахуванням епох мілісекунд, ще краще: SELECT DATEADD (мс, 1517270454852% 1000, DATEADD (S, 1517270454852/1000, '1970-01-01'))
G DeMasters

25

Подобається це

додайте дату часу Unix (епохи) до базової дати в секундах

це отримає зараз (2010-05-25 07: 56: 23.000)

 SELECT dateadd(s,1274756183,'19700101 05:00:00:000')

Якщо ви хочете перейти назад, подивіться на цей http://wiki.lessthandot.com/index.php/Epoch_Date


1
чому 05:00:00 замість 00:00:00?
Svisstack

2
@Svisstack 5 годин - це різниця в часовому поясі. 5:00:00 означає, що він GMT-5 годин
Джорді ван Ейк

Працює як шарм. Якщо вам потрібно налаштувати часовий пояс, то обов'язково зробіть це, але вважайте це дуже ефективним
clifton_h

7

Це зробить це:

declare @UNIX_TIME int
select @UNIX_TIME = 1111111111
-- Using dateadd to add seconds to 1970-01-01
select [Datetime from UNIX Time] = dateadd(!precision!,@UNIX_TIME,'1970-01-01')

Замість! Точності! використання: ss, ms або mcs відповідно до точності часової позначки. Bigint здатний утримувати мікросекундну точність.



4

Якщо додати n секунд 1970-01-01, ви отримаєте дату UTC, оскільки n , часова мітка Unix, - це кількість секунд, що минули з 00:00:00 Універсальний координований час (UTC), четвер, 1 січня 1970 року .

У SQL Server 2016 можна перетворити один часовий пояс в інший за допомогою AT TIME ZONE. Вам просто потрібно знати назву часового поясу у стандартному форматі Windows:

SELECT *
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
CROSS APPLY (SELECT DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC') AS CA1(UTCDate)
CROSS APPLY (SELECT UTCDate AT TIME ZONE 'Pacific Standard Time') AS CA2(LocalDate)
| UnixTimestamp | UTCDate                    | LocalDate                  |
|---------------|----------------------------|----------------------------|
| 1514808000    | 2018-01-01 12:00:00 +00:00 | 2018-01-01 04:00:00 -08:00 |
| 1527854400    | 2018-06-01 12:00:00 +00:00 | 2018-06-01 05:00:00 -07:00 |

Або просто:

SELECT *, DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time'
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
| UnixTimestamp | LocalDate                  |
|---------------|----------------------------|
| 1514808000    | 2018-01-01 04:00:00 -08:00 |
| 1527854400    | 2018-06-01 05:00:00 -07:00 |

Примітки:

  • Ви можете відрізати інформацію про часовий пояс, перейшовши DATETIMEOFFSETна DATETIME.
  • Перетворення враховує літній час. Тихоокеанським часом був UTC-08: 00 січня 2018 року та UTC-07: 00 червня 2018 року.

3

Якщо час у мілісекундах і потрібно їх зберегти:

DECLARE @value VARCHAR(32) = '1561487667713';

SELECT DATEADD(MILLISECOND, CAST(RIGHT(@value, 3) AS INT) - DATEDIFF(MILLISECOND,GETDATE(),GETUTCDATE()), DATEADD(SECOND, CAST(LEFT(@value, 10) AS INT), '1970-01-01T00:00:00'))

1

Це усуває роботу, яку Деніел Літт зробив для цього питання, але з урахуванням літнього часу (працює на дати 01-01 1902 і більше через обмеження int на функцію додавання дат):

Спочатку нам потрібно створити таблицю, яка буде зберігати діапазони дат для літнього часу (джерело: Історія часу у Сполучених Штатах ):

CREATE TABLE [dbo].[CFG_DAY_LIGHT_SAVINGS_TIME](
  [BEGIN_DATE] [datetime] NULL,
  [END_DATE] [datetime] NULL,
  [YEAR_DATE] [smallint] NULL
) ON [PRIMARY]

GO

INSERT INTO CFG_DAY_LIGHT_SAVINGS_TIME VALUES
('2001-04-01 02:00:00.000',   '2001-10-27 01:59:59.997',    2001),
('2002-04-07 02:00:00.000',   '2002-10-26 01:59:59.997',    2002),
('2003-04-06 02:00:00.000',   '2003-10-25 01:59:59.997',    2003),
('2004-04-04 02:00:00.000',   '2004-10-30 01:59:59.997',    2004),
('2005-04-03 02:00:00.000',   '2005-10-29 01:59:59.997',    2005),
('2006-04-02 02:00:00.000',   '2006-10-28 01:59:59.997',    2006),
('2007-03-11 02:00:00.000',   '2007-11-03 01:59:59.997',    2007),
('2008-03-09 02:00:00.000',   '2008-11-01 01:59:59.997',    2008),
('2009-03-08 02:00:00.000',   '2009-10-31 01:59:59.997',    2009),
('2010-03-14 02:00:00.000',   '2010-11-06 01:59:59.997',    2010),
('2011-03-13 02:00:00.000',   '2011-11-05 01:59:59.997',    2011),
('2012-03-11 02:00:00.000',   '2012-11-03 01:59:59.997',    2012),
('2013-03-10 02:00:00.000',   '2013-11-02 01:59:59.997',    2013),
('2014-03-09 02:00:00.000',   '2014-11-01 01:59:59.997',    2014),
('2015-03-08 02:00:00.000',   '2015-10-31 01:59:59.997',    2015),
('2016-03-13 02:00:00.000',   '2016-11-05 01:59:59.997',    2016),
('2017-03-12 02:00:00.000',   '2017-11-04 01:59:59.997',    2017),
('2018-03-11 02:00:00.000',   '2018-11-03 01:59:59.997',    2018),
('2019-03-10 02:00:00.000',   '2019-11-02 01:59:59.997',    2019),
('2020-03-08 02:00:00.000',   '2020-10-31 01:59:59.997',    2020),
('2021-03-14 02:00:00.000',   '2021-11-06 01:59:59.997',    2021),
('2022-03-13 02:00:00.000',   '2022-11-05 01:59:59.997',    2022),
('2023-03-12 02:00:00.000',   '2023-11-04 01:59:59.997',    2023),
('2024-03-10 02:00:00.000',   '2024-11-02 01:59:59.997',    2024),
('2025-03-09 02:00:00.000',   '2025-11-01 01:59:59.997',    2025),
('1967-04-30 02:00:00.000',   '1967-10-29 01:59:59.997',    1967),
('1968-04-28 02:00:00.000',   '1968-10-27 01:59:59.997',    1968),
('1969-04-27 02:00:00.000',   '1969-10-26 01:59:59.997',    1969),
('1970-04-26 02:00:00.000',   '1970-10-25 01:59:59.997',    1970),
('1971-04-25 02:00:00.000',   '1971-10-31 01:59:59.997',    1971),
('1972-04-30 02:00:00.000',   '1972-10-29 01:59:59.997',    1972),
('1973-04-29 02:00:00.000',   '1973-10-28 01:59:59.997',    1973),
('1974-01-06 02:00:00.000',   '1974-10-27 01:59:59.997',    1974),
('1975-02-23 02:00:00.000',   '1975-10-26 01:59:59.997',    1975),
('1976-04-25 02:00:00.000',   '1976-10-31 01:59:59.997',    1976),
('1977-04-24 02:00:00.000',   '1977-10-31 01:59:59.997',    1977),
('1978-04-30 02:00:00.000',   '1978-10-29 01:59:59.997',    1978),
('1979-04-29 02:00:00.000',   '1979-10-28 01:59:59.997',    1979),
('1980-04-27 02:00:00.000',   '1980-10-26 01:59:59.997',    1980),
('1981-04-26 02:00:00.000',   '1981-10-25 01:59:59.997',    1981),
('1982-04-25 02:00:00.000',   '1982-10-25 01:59:59.997',    1982),
('1983-04-24 02:00:00.000',   '1983-10-30 01:59:59.997',    1983),
('1984-04-29 02:00:00.000',   '1984-10-28 01:59:59.997',    1984),
('1985-04-28 02:00:00.000',   '1985-10-27 01:59:59.997',    1985),
('1986-04-27 02:00:00.000',   '1986-10-26 01:59:59.997',    1986),
('1987-04-05 02:00:00.000',   '1987-10-25 01:59:59.997',    1987),
('1988-04-03 02:00:00.000',   '1988-10-30 01:59:59.997',    1988),
('1989-04-02 02:00:00.000',   '1989-10-29 01:59:59.997',    1989),
('1990-04-01 02:00:00.000',   '1990-10-28 01:59:59.997',    1990),
('1991-04-07 02:00:00.000',   '1991-10-27 01:59:59.997',    1991),
('1992-04-05 02:00:00.000',   '1992-10-25 01:59:59.997',    1992),
('1993-04-04 02:00:00.000',   '1993-10-31 01:59:59.997',    1993),
('1994-04-03 02:00:00.000',   '1994-10-30 01:59:59.997',    1994),
('1995-04-02 02:00:00.000',   '1995-10-29 01:59:59.997',    1995),
('1996-04-07 02:00:00.000',   '1996-10-27 01:59:59.997',    1996),
('1997-04-06 02:00:00.000',   '1997-10-26 01:59:59.997',    1997),
('1998-04-05 02:00:00.000',   '1998-10-25 01:59:59.997',    1998),
('1999-04-04 02:00:00.000',   '1999-10-31 01:59:59.997',    1999),
('2000-04-02 02:00:00.000',   '2000-10-29 01:59:59.997',    2000)
GO

Тепер ми створюємо функцію для кожного американського часового поясу. Це за умови, що час Unix знаходиться в мілісекундах. Якщо це за секунди, вийміть / 1000 з коду:

Тихоокеанський

create function [dbo].[UnixTimeToPacific] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @pacificdatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @pacificdatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -7 else -8 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @pacificdatetime is null 
       select @pacificdatetime= dateadd(hour, -7, @interimdatetime)
return @pacificdatetime    
end

Східний

create function [dbo].[UnixTimeToEastern] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @easterndatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @easterndatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -4 else -5 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @easterndatetime is null 
       select @easterndatetime= dateadd(hour, -4, @interimdatetime)
return @easterndatetime    
end

Центральний

create function [dbo].[UnixTimeToCentral] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @centraldatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @centraldatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -5 else -6 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @centraldatetime is null 
       select @centraldatetime= dateadd(hour, -5, @interimdatetime)
return @centraldatetime    
end

Гора

create function [dbo].[UnixTimeToMountain] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @mountaindatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @mountaindatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -6 else -7 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @mountaindatetime is null 
       select @mountaindatetime= dateadd(hour, -6, @interimdatetime)
return @mountaindatetime    
end

Гаваї

create function [dbo].[UnixTimeToHawaii] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @hawaiidatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @hawaiidatetime =  dateadd(hour,-10,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)

return @hawaiidatetime    
end

Арізона

create function [dbo].[UnixTimeToArizona] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @arizonadatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @arizonadatetime =  dateadd(hour,-7,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)

return @arizonadatetime    
end

Аляска

create function [dbo].[UnixTimeToAlaska] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @alaskadatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @alaskadatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -8 else -9 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @alaskadatetime is null 
       select @alaskadatetime= dateadd(hour, -8, @interimdatetime)
return @alaskadatetime    
end

1
//BIGINT UNIX TIMESTAMP CONVERSION upto Millisecond Accuracy
CREATE FUNCTION [dbo].[ConvertUnixTimestamp] (@Datetime [BIGINT]) RETURNS DATETIME
AS
BEGIN

    RETURN DATEADD(MILLISECOND, cast(@Datetime as bigint) % 1000, 
    DATEADD(SECOND, (cast(@Datetime as bigint) / 1000)%60, 
    DATEADD(MINUTE, ((cast(@Datetime as bigint) / 1000)/60)%60, 
    DATEADD(HOUR, ((cast(@Datetime as bigint) / 1000)/60)/60, '19700101'))))
END

1

Мені довелося зіткнутися і з цією проблемою. На жаль, жодна з відповідей (тут і на десятках інших сторінок) для мене не задовільна, оскільки я досі не можу досягти дат після 2038 року через десь 32-бітні цілі числа.

Зрештою, для мене все-таки спрацювало: використовувати floatзмінні, тож я міг мати хоча б максимум дати 2262-04-11T23:47:16.854775849. Однак це не стосується всього datetimeдомену, але це достатньо для моїх потреб і може допомогти іншим, хто стикається з тією ж проблемою.

-- date variables
declare @ts bigint; -- 64 bit time stamp, 100ns precision
declare @d datetime2(7) = GETUTCDATE(); -- 'now'
-- select @d = '2262-04-11T23:47:16.854775849'; -- this would be the max date

-- constants:
declare @epoch datetime2(7) = cast('1970-01-01T00:00:00' as datetime2(7));
declare @epochdiff int = 25567; -- = days between 1900-01-01 and 1970-01-01
declare @ticksofday bigint = 864000000000; -- = (24*60*60*1000*1000*10)

-- helper variables:
declare @datepart float;
declare @timepart float;
declare @restored datetime2(7);

-- algorithm:
select @ts = DATEDIFF_BIG(NANOSECOND, @epoch, @d) / 100; -- 'now' in ticks according to unix epoch
select @timepart = (@ts % @ticksofday) / @ticksofday; -- extract time part and scale it to fractional part (i. e. 1 hour is 1/24th of a day)
select @datepart = (@ts - @timepart) / @ticksofday; -- extract date part and scale it to fractional part
select @restored = cast(@epochdiff + @datepart + @timepart as datetime); -- rebuild parts to a datetime value

-- query original datetime, intermediate timestamp and restored datetime for comparison
select
  @d original,
  @ts unix64,
  @restored restored
;

-- example result for max date:
-- +-----------------------------+-------------------+-----------------------------+
-- | original                    | unix64            | restored                    |
-- +-----------------------------+-------------------+-----------------------------+
-- | 2262-04-11 23:47:16.8547758 | 92233720368547758 | 2262-04-11 23:47:16.8533333 |
-- +-----------------------------+-------------------+-----------------------------+

Є кілька моментів, які слід врахувати:

  • Точність 100ns - це вимога в моєму випадку, однак, здається, це стандартна роздільна здатність для 64-бітних часових позначок Unix. Якщо ви використовуєте будь-яку іншу роздільну здатність, вам доведеться відповідно скоригувати @ticksofdayі перший рядок алгоритму.
  • Я використовую інші системи, які мають свої проблеми з часовими поясами і т. Д., І я знайшов, що найкращим рішенням для мене завжди буде використання UTC. Для ваших потреб це може відрізнятися.
  • 1900-01-01є датою початку для datetime2, так само, як і епоха 1970-01-01часових позначок Unix.
  • floats допомогла мені вирішити проблему року-2038 та цілочисельні переливи тощо, але майте на увазі, що числа з плаваючою комою не дуже ефективні і можуть уповільнити обробку великої кількості часових позначок. Крім того, поплавці можуть призвести до втрати точності через помилки округлення, як ви бачите при порівнянні результатів прикладу для максимальної дати, вказаної вище (тут помилка становить приблизно 1,44425 мс).
  • В останньому рядку алгоритму є переклад на datetime. На жаль, не існує явного виступу з числових значень до datetime2дозволених, але дозволено присвоєння числом datetimeявним чином, а це, в свою чергу, призначається неявно datetime2. Наразі це може бути правильним, але це може змінитися в майбутніх версіях SQL Server: або буде dateadd_big()функція, або явний каст datetime2буде дозволено, або явний каст datetimeбуде заборонено, так що це може зламатися або може виникнути простішим способом якогось дня.

1

Для GMT ось найпростіший спосіб:

Select dateadd(s, @UnixTime+DATEDIFF (S, GETUTCDATE(), GETDATE()), '1970-01-01')

0

Краще? Ця функція перетворює одночасно в мілісекундах на дату. Це втрачено мілісекунд, але все ще дуже корисно для фільтрації.

CREATE FUNCTION [dbo].[UnixTimestampToGMTDatetime] 
(@UnixTimestamp bigint)
RETURNS datetime
AS
BEGIN
       DECLARE @GMTDatetime datetime
       select @GMTDatetime = 
       CASE
       WHEN dateadd(ss, @UnixTimestamp/1000, '1970-01-01') 
       BETWEEN 
           Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-03-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 4) % 7)) + ' 01:00:00', 20)
       AND
           Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-10-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 1) % 7)) + ' 02:00:00', 20)
       THEN Dateadd(hh, 1, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
       ELSE Dateadd(hh, 0, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
       END
RETURN @GMTDatetime    
END

0

Рішенням може бути таке:

DECLARE @UnixTimeStamp bigint = 1564646400000 /*2019-08-01 11:00 AM*/

DECLARE @LocalTimeOffset bigint = DATEDIFF(MILLISECOND, GETDATE(), GETUTCDATE());
DECLARE @AdjustedTimeStamp bigint = @UnixTimeStamp - @LocalTimeOffset;
SELECT [DateTime] = DATEADD(SECOND, @AdjustedTimeStamp % 1000, DATEADD(SECOND, @AdjustedTimeStamp / 1000, '19700101'));

0

@DanielLittle має найпростішу та найелегантнішу відповідь на конкретне питання. Однак якщо ви зацікавлені в переході на певний часовий пояс ТА з урахуванням літнього часу (літній час), то наступне:

CAST(DATEADD(S, [UnixTimestamp], '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS Datetime)

Примітка. Це рішення працює лише на SQL Server 2016 і вище (та Azure).

Щоб створити функцію:

CREATE FUNCTION dbo.ConvertUnixTime (@input INT)
RETURNS Datetime
AS BEGIN
    DECLARE @Unix Datetime

    SET @Unix = CAST(DATEADD(S, @Input, '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS Datetime)

    RETURN @Unix
END

Ви можете викликати функцію так:

SELECT   dbo.ConvertUnixTime([UnixTimestamp])
FROM     YourTable
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.