М / Д / ГГГГ ч: мм тт в DATETIME SQL Server - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь преобразовать строковую дату в тип данных datetime на сервере sql.Этот вопрос был задан в другом форуме, однако моя ситуация немного отличается. Возможности строковой даты

tt= AM or PM

M/D/YYYY h:mm tt
M/DD/YYYY h:mm tt
MM/D/YYYY h:mm tt
MM/DD/YYYY h:mm tt

M/D/YYYY hh:mm tt
M/DD/YYYY hh:mm tt
MM/D/YYYY hh:mm tt
MM/DD/YYYY hh:mm tt

Этот же вопрос был задан в https://social.msdn.microsoft.com/Forums/en-US/3c0a7f57-123b-4312-b562-57459fef733a/mdyyyy-hmmss-tt-to-datetime?forum=sqlintegrationservices

, и было дано решение.

    DECLARE @formats TABLE (notADateTime VARCHAR(30))
INSERT INTO @formats (notADateTime) VALUES 
('1/1/2015 1:01:12 AM'), ('1/01/2015 1:12:12 PM'), ('12/2/2015 1:11:12 AM'), ('08/13/2015 1:22:44 PM'),
('1/1/2015 10:01:11 PM'),('1/01/2015 10:12:12 AM'),('12/2/2015 12:5:12 AM'),('08/13/2015 01:44:55 AM')

SELECT *,
LEFT(RIGHT(notADateTime,CHARINDEX('/',REVERSE(notADateTime))-1),4) + '-' +
RIGHT('00'+LEFT(notADateTime,CHARINDEX('/',notADateTime)-1),2) + '-' +
RIGHT('00'+REPLACE(SUBSTRING(notADateTime,CHARINDEX('/',notADateTime)+1,2),'/',''),2) + ' ' +
RIGHT('00'+CAST(CASE WHEN RIGHT(notADateTime,2) = 'PM' THEN 12 ELSE 0 END + RIGHT('00'+REPLACE(LEFT(notADateTime,CHARINDEX(':',notADateTime)-1),' ','0'),2) AS VARCHAR),2) + ':' +
RIGHT('00'+REPLACE(SUBSTRING(notADateTime,CHARINDEX(':',notADateTime)+1,2),':',''),2) + ':' +
REVERSE(LEFT(RIGHT(notADateTime,CHARINDEX(':',REVERSE(notADateTime))-1),2))
  FROM @formats

Однако никакого объяснения не было дано, и разница в том, что я пытаюсь сделать то же самое преобразование со секундами в строке.Когда я запускаю этот код, я получаю ошибку, потому что правильное целое число функции не является правильным.Любая помощь / объяснение было бы чрезвычайно полезно

1 Ответ

0 голосов
/ 12 июня 2018

Работа со строками выполняется для преобразования ее в признанный стандартный формат ISO.Без этого ошибка CAST / CONVERT может быть допущена в замешательстве дней и месяцев, поскольку разные культуры используют разные форматы дат.Например, 12/2/2015 может представлять 2 декабря или 12 февраля.

Предоставленный ответ создает строку в формате ISO «ГГГГ-ММ-ДД ЧЧ: мм: сс».Первая строка после SELECT извлекает год и добавляет дефис, строка после этого - месяц и дефис и так далее.Я предполагаю, что вы заметили ту часть в этой статье, где ОП указал на ошибку в принятом ответе.

Я предполагаю, что вы знаете, что делает каждая отдельная функция (если вы этого не сделаете, вы можете найтиопределения на MSDN - делайте это сейчас, или то, что следует, не будет иметь смысла).Однако, вероятно, это поможет объяснить некоторые шаблоны, используемые в решении, когда эти функции используются вместе.

CHARINDEX('/',REVERSE(notADateTime)) смотрит на строку задом наперед и находит first / (и так как строка обратная, это последний /).Таким образом, при использовании в сочетании с 'RIGHT', RIGHT(notADateTime,CHARINDEX('/',REVERSE(notADateTime))-1) возвращает правый конец строки после того, как последний /.

RIGHT('00'+*value*,2) используется для обеспечения определенных значений (таких как часы, минуты, дни и месяцы) имеют две цифры.2 означает, что им нужны последние два символа (которые будут цифрами, поскольку это число).Обратите внимание, что «00» должно быть только «0», так как любое целое число всегда имеет одну цифру.

Как только это в этом формате, оберните его в CAST в DATETIME2, так что это больше не строка.

Теперь у вас есть понимание, что вы должны иметь возможность решить это самостоятельно.Помните, что решение ожидало секунд, которых нет у ваших строк.Дайте мне знать, если вам нужна дополнительная помощь, добавив комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...