Як перетворити стовпець позначки часу SQL Server у формат дати та часу


88

Оскільки 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'))

Відповіді:


250

Тип 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функцію для власного форматування ......


5
Ймовірно, це моя найбільша розвага з SQL Server. Навіщо називати це позначкою часу, якщо я не можу визначити час з нею?
BelgoCanadian

1
@BelgoCanadian: запитайте Sybase - це функція, яка була у Sybase / SQL Server назавжди .....
marc_s

1
@BelgoCanadian Вам повинно бути приємно дізнатись, що це зараз називається rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/…
Джейсон С

є TIMESTAMPколонки типу
Ghilteras

4

Найпростіший спосіб зробити це:

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

Це дає стовпець дати щонайменше у зручному для читання форматі. Далі, якщо ви хочете змінити формат, натисніть тут .


11
питання в SQLServer, а не в MySQL
Mike M

4

За допомогою приведення ви можете отримати дату з поля мітки часу:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

18
Здається, це не працює:Explicit conversion from data type timestamp to date is not allowed.
jocull

Погана ідея. Поле мітки часу - це просто послідовність. Можливо, вам пощастить і побачення, але дата не матиме значення. Вам слід передати BIGINT, якщо ви хочете десяткове число, а не шістнадцяткове. Відмітка часу тепер називається rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/…
Джейсон С

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);

3

Чудово працює, крім цього повідомлення:

Неявне перетворення з типу даних varchar у мітку часу не дозволяється. Використовуйте функцію CONVERT для запуску цього запиту

Так що так, TIMESTAMP( RowVersion) НЕ ДАТА :)

Чесно кажучи, я досить довго барахтався, щоб знайти спосіб перетворити його на побачення.

Найкращий спосіб - перетворити його на INT та порівняти. Ось яким повинен бути цей тип.

Якщо ви хочете побачення - просто додайте Datetime стовпець і живіть щасливо до кінця :)

ура на Mac


1
Або ВЕЛИКИЙ, оскільки це 8 байт
Джейсон С

2

"Ви продовжуєте використовувати це слово. Я не думаю, що воно означає те, що ви думаєте, що означає". - Ініго Монтойя

Мітка часу абсолютно не має відношення до часу, як спочатку говорили 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

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

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126

Так, це не дата і час, це серійні номери



0

У мене була та ж проблема з позначкою часу, наприклад: '29-липень-20 04.46.42.000000000 PM '. Я хотів перетворити його у формат "рррр-ММ-дд". Рішення, яке нарешті працює для мене, є

ВИБЕРІТЬ TO_CHAR (мітна позначка, 'РРРР-ММ-ДД') З таблиці;


0

Я припускаю, що ви зробили дамп даних як оператори вставки, і ви (або хтось із них погуглив) намагаєтеся з'ясувати дату та час або перекласти їх для використання в іншому місці (наприклад: перетворити на вставки MySQL). Це насправді легко в будь-якій мові програмування.

Давайте працюватимемо з цим:

CAST(0x0000A61300B1F1EB AS DateTime)

Це шістнадцяткове подання насправді є двома окремими елементами даних ... Дата та час. Перші чотири байти - це дата, другі чотири байти - час.

  • Дата 0x0000A613
  • Час 0x00B1F1EB

Перетворіть обидва сегменти на цілі числа за допомогою обраної вами мови програмування (це пряме шістнадцяткове перетворення у ціле число, яке підтримується у кожній сучасній мові програмування, тому я не буду витрачати місце з кодом, який може бути або не бути мовою програмування) в якому ви працюєте).

  • Дата 0x0000A613 стає 42515
  • Час 0x00B1F1EB стає 11661803

Тепер, що робити з цілими числами:

Дата

Дата починається з 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


-1

Деякі з них насправді приховують дату-час з SQL Server 2008 і далі.

Спробуйте наступний запит SQL, і ви переконаєтесь самі:

SELECT CAST (0x00009CEF00A25634 AS datetime)

Вищезазначене призведе до, 2009-12-30 09:51:03:000але я зіткнувся з такими, які насправді не відповідають даті-часу.


1
Не роби цього. Можливо, вам пощастить і перетворять конверсію, але дата буде безглуздою та оманливою. Відмітка часу є просто порядковим номером і тепер називається версією рядка docs.microsoft.com/en-us/sql/t-sql/data-types/… . Якщо ви хочете десяткове число, просто передайте BIGINT
Jason S


-3

Не впевнений, що мені щось тут не вистачає, але чи можете ви просто перетворити позначку часу так:

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

Ви спробували це? TIMESTAMP не має відношення до DATE.
Шон Пірс,

Я використовую його на SQL Server 2008
Даніель

Знову ж таки, не намагайтеся проводити трансляцію на дату. Це просто ціла послідовність у шістнадцятковій формі. Просто киньте на BIGINT.
Jason S,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.