Как преобразовать столбец 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)