Как создать и вставить запись с меткой времени Unix - SQL Server 2014 - PullRequest
0 голосов
/ 11 января 2019

Я хочу создать следующую таблицу:

user_id     unix_timestamp      platform     Action
   1         1501688421118         IOS         A

Моя таблица создания:

create table C (
user_id integer,
unix_timestamp timestamp,
platform varchar(50),
Action varchar(50)   
);

Тогда я хочу вставить строку:

INSERT INTO C 
VALUES ('1', 1501688421118, 'IOS','A');

Я получил ошибку, я попытался использовать varbinary (8) вместо метки времени, но когда я выполняю вставку, я получаю двоичный результат в столбце unix_timestamp вместо 1501688421118.

1 Ответ

0 голосов
/ 11 января 2019

Согласно документам MSDN:

Синтаксис метки времени устарел. Эта функция в обслуживании режим и может быть удален в будущей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте изменить приложения, которые в настоящее время используют эту функцию.

Используйте тип данных binary(8) или varbinary(8), если хотите nullable отметка времени:

create table C (
user_id integer,
unix_timestamp binary(8),
platform varchar(50),
Action varchar(50)   
);

Как сказано в документе MSDN:

Метка времени является синонимом типа данных rowversion и является предметом к поведению синонимов типа данных. В выражениях DDL используйте везде, где это возможно, вместо строки времени Не обнуляемый Столбец rowversion семантически эквивалентен двоичному (8) столбцу. Nullable rowversion столбец семантически эквивалентен столбец varbinary (8).

UPDATE:

AS MSDN говорит , что вы не можете преобразовать TIMESTAMP SQL Server в дату / время - это просто не date/time:

Это тип данных, который предоставляет автоматически сгенерированный, уникальный двоичный файл числа в базе данных. rowversion обычно используется в качестве механизма для версионно-штамповочных строк таблицы. Тип данных rowversion является просто увеличивая число и не сохраняя дату или время. Записать дата или время, используйте тип данных datetime2.

Но вы можете попробовать. Полный пример:

CREATE table C (
user_id integer,
unix_timestamp binary(8),
platform varchar(50),
Action varchar(50)   
)

Затем вставьте данные. У меня здесь метка времени Unix :

INSERT INTO dbo.C
(
    user_id,
    unix_timestamp,
    platform,
    Action
)
VALUES
(   1,    -- user_id - int
    1501688421, -- unix_timestamp - binary(8)
    'Android',   -- platform - varchar(50)
    'A'    -- Action - varchar(50)
    )

SELECT 
c.unix_timestamp
, DATEADD(S, c.unix_timestamp, '1970-01-01')
FROM dbo.C c

ВЫВОД:

 2017-08-02 15:40:21.000

Или просто создайте таблицу с правильным типом данных:

create table C (
user_id integer,
unix_timestamp DateTime2,
platform varchar(50),
Action varchar(50)   
);
...