Как преобразовать столбец отметки времени SQL Server в формат даты и времени - PullRequest
74 голосов
/ 14 ноября 2011

Поскольку 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'))

Ответы [ 9 ]

222 голосов
/ 14 ноября 2011

Тип данных TIMESTAMP SQL Server не имеет ничего , связанного с датой и временем!

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

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

SELECT CAST (0x0000000017E30D64 AS BIGINT)

Результат

400756068

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

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

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

Но если вы говорите о метке времени, но на самом деле вы имеете в виду столбец DATETIME, то вы можете использовать любой из этих допустимых форматов даты, описанных в разделе CAST and 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 для пользовательского форматирования ......

4 голосов
/ 13 февраля 2016

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

SELECT CAST(timestamp_field AS DATE) FROM tbl_name
3 голосов
/ 04 ноября 2014

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

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

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

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

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

Если вам нужна дата - просто добавьте столбец Datetime и живите долго и счастливо :)

ура Mac

3 голосов
/ 12 сентября 2012

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

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);
2 голосов
/ 20 апреля 2018

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

Отметка времени не имеет абсолютно никакого отношения ко времени, как первоначально сказал 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 секунд. Если бы это было связано со временем, тогда бы была временная метка, чтобы соответствовать разнице во времени.

0 голосов
/ 19 сентября 2017

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

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

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

0 голосов
/ 26 мая 2016

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

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)
0 голосов
/ 03 февраля 2016

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

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

SELECT CAST (0x00009CEF00A25634 AS datetime)

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

0 голосов
/ 11 мая 2015

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

...