Как преобразовать столбец timestamp SQL Server в формат даты и времени

Так как SQL Server возвращает отметку времени, например 'Nov 14 2011 03:12:12:947PM', есть ли простой способ преобразования формата строки в дату, например "Y-m-d H: i: s".

До сих пор я использую

date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))

Ответ 1

Тип данных SQL Server TIMESTAMP не имеет никакого отношения к дате и времени!

Это просто шестнадцатеричное представление последовательного 8-байтового целого числа - это полезно только для того, чтобы убедиться, что строка не изменилась с момента ее чтения.

Вы можете прочитать шестнадцатеричное целое число или, если хотите, BIGINT. Как пример:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

Результат

400756068

В более новых версиях SQL Server он называется RowVersion - поскольку это действительно так. См. документы MSDN по ROWVERSION:

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

Таким образом, вы не можете преобразовать SQL Server TIMESTAMP в дату/время - это просто не дата/время.

Но если вы говорите о метке времени, но на самом деле вы имеете в виду столбец DATETIME - тогда вы можете использовать любой из этих допустимых форматов даты, описанных в разделе CAST и CONVERT справки MSDN. Они определены и поддерживаются "из коробки" SQL Server. Все остальное не поддерживается, например Вы должны выполнять много ручной и конкатенации (не рекомендуется).

Формат, который вы ищете, выглядит как канонический ODBC (style = 121):

DECLARE @today DATETIME = SYSDATETIME()

SELECT CONVERT(VARCHAR(50), @today, 121)

дает:

2011-11-14 10:29:00.470

SQL Server 2012 наконец-то получит функцию FORMAT для пользовательского форматирования......

Ответ 2

Используя приведение, вы можете получить дату из поля отметки времени:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

Ответ 3

Мои коллеги помогли мне в этом:

select CONVERT(VARCHAR(10), <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(VARCHAR(10), <tms_column>, 112);

или

select CONVERT(DATE, <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(DATE, <tms_column>, 112);

Ответ 4

Работает нормально, кроме этого сообщения:

Неявное преобразование из типа данных varchar в метку времени не допускается. Используйте функцию CONVERT для выполнения этого запроса

Так что да, TIMESTAMP (RowVersion) не НЕ ДАТА :)

Если честно, я довольно долго возился, чтобы найти способ преобразовать его в дату.

Лучший способ - преобразовать его в INT и сравнить. Это то, для чего предназначен этот тип.

Если ты хочешь свидание - просто добавь колонку Datetime и живи долго и счастливо :)

ура Mac

Ответ 5

"Вы продолжаете использовать это слово. Я не думаю, что это означает, что вы думаете, что это значит". - Иниго Монтойя

Отметка времени не имеет абсолютно никакого отношения ко времени, как первоначально сказал marc_s.

declare @Test table (
     TestId int identity(1,1) primary key clustered
    ,Ts     timestamp
    ,CurrentDt datetime default getdate()
    ,Something varchar(max)
)

insert into @Test (Something)
    select name from sys.tables
waitfor delay '00:00:10'

insert into @Test (Something)
    select name from sys.tables

select * from @Test

Обратите внимание на вывод, что Ts (hex) увеличивается на единицу для каждой записи, но фактическое время имеет разрыв в 10 секунд. Если бы это было связано со временем, тогда бы была временная метка, чтобы соответствовать разнице во времени.

Ответ 6

Самый простой способ сделать это:

SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;

Это дает столбец даты по крайней мере в читаемом формате. Далее, если вы хотите изменить формат te, нажмите здесь.

Ответ 7

После имплементации преобразования в целое число CONVERT (BIGINT, [timestamp]) как timestamp У меня есть результат, как

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126

Да, это не дата и время, это серийные номера

Ответ 8

Почему бы не попробовать FROM_UNIXTIME(unix_timestamp, format)?

Ответ 9

Некоторые из них действительно преобразуются в дату и время начиная с SQL Server 2008 и далее.

Попробуйте следующий SQL-запрос, и вы сами увидите:

SELECT CAST (0x00009CEF00A25634 AS datetime)

Приведенное выше приведёт к 2009-12-30 09:51:03:000, но я встречал те, которые на самом деле не отображаются на дату-время.

Ответ 10

Не уверен, что здесь что-то не хватает, но вы не можете просто преобразовать временную метку следующим образом:

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)