Оскільки SQL Server повертає мітку часу, як 'Nov 14 2011 03:12:12:947PM'
, чи існує якийсь простий спосіб перетворити рядок у формат дати, такий як 'Ymd H: i: s'.
Поки що я використовую
date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))
Відповіді:
Тип TIMESTAMP
даних SQL Server не має нічого спільного з датою та часом!
Це просто шістнадцяткове представлення послідовного цілого 8-байтового числа - це добре лише для того, щоб переконатися, що рядок не змінився з моменту його прочитання.
Ви можете прочитати шістнадцяткове ціле число або, якщо хочете BIGINT
. Як приклад:
SELECT CAST (0x0000000017E30D64 AS BIGINT)
Результат є
400756068
У новіших версіях SQL Server це називається RowVersion
- оскільки це насправді це. Перегляньте документи MSDN щодо ROWVERSION :
Це тип даних, який надає автоматично згенеровані унікальні двійкові числа в базі даних. rowversion зазвичай використовується як механізм для штампування версій рядків таблиці. Тип даних rowversion - це просто число, що збільшується, і не зберігає дату чи час . Щоб записати дату чи час, використовуйте тип даних datetime2.
Таким чином, ви не можете перетворити SQL ServerTIMESTAMP
на дату / час - це просто не дата / час.
Але якщо ви говорите про позначку часу, але насправді ви маєте на увазі DATETIME
стовпець - тоді ви можете використовувати будь-який із цих дійсних форматів дат, описаних у темі CAST і CONVERT у довідці MSDN. Вони визначаються та підтримуються "нестандартно" SQL Server. Будь-що інше не підтримується, наприклад, вам доведеться робити багато ручного лиття та конкатенації (не рекомендується).
Формат, який ви шукаєте, трохи схожий на канонічний ODBC (стиль = 121):
DECLARE @today DATETIME = SYSDATETIME()
SELECT CONVERT(VARCHAR(50), @today, 121)
дає:
2011-11-14 10:29:00.470
SQL Server 2012 нарешті отримає FORMAT
функцію для власного форматування ......
TIMESTAMP
колонки типу
За допомогою приведення ви можете отримати дату з поля мітки часу:
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
Explicit conversion from data type timestamp to date is not allowed.
Мої колеги допомогли мені в цьому:
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);
Чудово працює, крім цього повідомлення:
Неявне перетворення з типу даних varchar у мітку часу не дозволяється. Використовуйте функцію CONVERT для запуску цього запиту
Так що так, TIMESTAMP
( RowVersion
) НЕ ДАТА :)
Чесно кажучи, я досить довго барахтався, щоб знайти спосіб перетворити його на побачення.
Найкращий спосіб - перетворити його на INT
та порівняти. Ось яким повинен бути цей тип.
Якщо ви хочете побачення - просто додайте Datetime
стовпець і живіть щасливо до кінця :)
ура на Mac
"Ви продовжуєте використовувати це слово. Я не думаю, що воно означає те, що ви думаєте, що означає". - Ініго Монтойя
Мітка часу абсолютно не має відношення до часу, як спочатку говорили 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 секунд. Якби це було пов’язано з часом, то в позначці часу містився б розрив, який би відповідав різниці в часі.
Після імпелемтації перетворення у ціле число CONVERT (BIGINT, [timestamp]) як Timestamp я отримав такий результат
446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126
Так, це не дата і час, це серійні номери
для мене працює: TO_DATE ('19700101', 'yyyymmdd') + (TIME / 24/60/60) (oracle DB)
Я припускаю, що ви зробили дамп даних як оператори вставки, і ви (або хтось із них погуглив) намагаєтеся з'ясувати дату та час або перекласти їх для використання в іншому місці (наприклад: перетворити на вставки MySQL). Це насправді легко в будь-якій мові програмування.
Давайте працюватимемо з цим:
CAST(0x0000A61300B1F1EB AS DateTime)
Це шістнадцяткове подання насправді є двома окремими елементами даних ... Дата та час. Перші чотири байти - це дата, другі чотири байти - час.
Перетворіть обидва сегменти на цілі числа за допомогою обраної вами мови програмування (це пряме шістнадцяткове перетворення у ціле число, яке підтримується у кожній сучасній мові програмування, тому я не буду витрачати місце з кодом, який може бути або не бути мовою програмування) в якому ви працюєте).
Тепер, що робити з цілими числами:
Дата
Дата починається з 01.01.1900 р. І відображається як дні. Отже, додайте 42 515 днів до 01.01.1900, і ваш результат - 27.05.2016.
Час
Час трохи складніший. Візьміть цей INT і зробіть наступне, щоб отримати свій час у мікросекундах з півночі (псевдокод):
TimeINT=Hex2Int(HexTime)
MicrosecondsTime = TimeINT*10000/3
Звідти використовуйте улюблені виклики функцій вашої мови, щоб перевести мікросекунди (38872676666,7 мкс у прикладі вище) у часі.
Результат буде 10: 47: 52,677
Деякі з них насправді приховують дату-час з SQL Server 2008 і далі.
Спробуйте наступний запит SQL, і ви переконаєтесь самі:
SELECT CAST (0x00009CEF00A25634 AS datetime)
Вищезазначене призведе до, 2009-12-30 09:51:03:000
але я зіткнувся з такими, які насправді не відповідають даті-часу.
Чому б не спробувати FROM_UNIXTIME(unix_timestamp, format)
?
Не впевнений, що мені щось тут не вистачає, але чи можете ви просто перетворити позначку часу так:
CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)