2015-09-11 3 views
1

Могут ли временные метки unix содержать значение миллисекунды времени?SQL вставляет временную метку unix с миллисекундами

Если да, то с помощью SQL Server 2008 R2:

CREATE TABLE [dbo].[my_table_calls_log] 
(
    [id] [bigint] IDENTITY(1,1) NOT NULL, 
    [requestdate] [bigint] NULL, 
    [partycode] [bigint] NULL, 

    CONSTRAINT [PK_my_table_calls_log] 
    PRIMARY KEY CLUSTERED ([id] ASC) 
) 

Следующая выберите дает мне текущую дату и время с миллисекундах:

SELECT CONVERT(VARCHAR,SYSDATETIME(),121); 

Пример:

2015-09-11 13:29:02.8239061 

Как я конвертирую это длинное YYYY-MM-DD HH: MM: SS.MS значение даты/времени в временную метку unix, чтобы я мог вставить ее, используя что-то вроде:

DECLARE @UnixDate AS bigint; 

SET @UnixDate = "the unix timestamp equivalent of SELECT CONVERT(VARCHAR,SYSDATETIME(),121);" 

INSERT INTO my_table_calls_log (requestdate,partycode) 
VALUES (@UnixDate,123); 

ответ

0

Стандартный UNIX метки времени являются 32-битные целые числа с точностью до 1 секунды (см here), который сказал там, конечно, ничего недействителен об использовании 64-разрядное целое число и используя точность миллисекунд если вы так решите (пока вы уверены, что весь код, который будет использовать/потребляет это значение времени, знает об этом ограничении). Большинство стандартных библиотек timestamp unix предполагают, что это точность 1 секунда, и если вы передадите 64-битное целое число со знаком, а не 32-разрядное целое, которое все еще выполняется, и предположение - это просто планирование более длительного срока службы метки времени (т.е. отслеживать значения даты/времени, прошедшие с 19 января 2038 года, и это означает, что временная метка unix на 32-разрядной основе перестанет работать в какой-то момент от эпохи по умолчанию из-за переполнения).

Unix метки времени также обычно предполагают базовую эпоху «1970-01-01 00:00:00», так что с помощью этого предположения вы можете преобразовать стандартные значения даты и времени SQL Server в unixtimestamp используя что-то вроде этого:

select datediff(second, '1970-01-01T00:00:00.000', sysdatetime()); 

Если вы хотите, чтобы это было основано на миллисекундах, оно становится немного более сложным, так как функция датированного в SQL Server - это 32-разрядное целочисленное (т. Е. Тип данных int) и разница между эпохой по умолчанию и текущей датой/time в миллисекундах превышает верхнюю границу этого типа, поэтому мы должны получить немного креатива, вот один из вариантов (который я склонен использовать в функции):

declare @start datetime2 = '1970-01-01T00:00:00.000', 
     @end datetime2 = sysdatetime(), 
     @ms_in_day bigint = 60 * 60 * 24 * 1000; 

select (@ms_in_day * datediff(day, @start, @end)) - datediff(millisecond, @end, cast(@end as date)); 

В каждом из этих примеров, если у вас есть значение даты/времени на основе varchar/character, просто вставьте непосредственно в скрипт вместо функции sysdatetime(), которую я использовал.