Як проаналізувати рядок за датою?


Відповіді:




21

Якщо припустити, що база даних MS SQL Server 2012 або новішої версії, ось рішення, яке працює. Основне твердження містить вбудований спробний розбір:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

Ось що ми застосували у виробничій версії:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

Стовпці ModifiedOn та ModifiedBy призначені лише для внутрішнього відстеження бази даних.

Дивіться також ці посилання на Microsoft MSDN:


Це передбачає, що ОП використовує Sql Server 2012+
Марк Крам

8

Хоча річ CONVERT працює, ви насправді не повинні її використовувати. Ви повинні запитати себе, чому ви розбираєте значення рядків у SQL-сервері. Якщо це одноразова робота, коли ви вручну виправляєте деякі дані, ви не отримаєте ці дані в інший раз, це нормально, але якщо будь-яка програма використовує це, вам слід щось змінити. Найкращим способом буде використання типу даних "дата". Якщо це введення користувачем, це ще гірше. Тоді спочатку слід перевірити клієнта. Якщо ви дійсно хочете передати рядкові значення там, де SQL-сервер очікує дати, ви завжди можете використовувати формат ISO ('РРРРРММДД'), і він повинен конвертувати автоматично.


5
Що можна сказати про ситуацію, коли ви імпортуєте файли даних із якоїсь зовнішньої системи, а вхідний стовпець буває в одному з таких форматів, наприклад, "05/31/2013", але який подається у вигляді рядка? І ви пишете, скажімо, збережену процедуру для імпорту цих даних або використовуєте SSIS для їх імпорту? Тоді CONVERT було б відповідною річчю для використання, чи не так?
Девід Барроуз,

Необов’язково, у ситуаціях, коли MS SQL Server розміщує аналітичні моделі даних, на відміну від транзакційних, цілком нормально використовувати CONVERT, оскільки йому доводиться мати справу з великою кількістю зовнішніх джерел, які не можуть легко надходити як тип дати (як згадував вище Девід Барроуз).
Буде

Типовий формат літерального рядка для дат - РРРР-ММ-ДД
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

зробить те, що потрібно, результат:

2012-04-24 00:00:00.000

Здається, це не працює для того, що ОП розмістило навіть для різних мовних налаштувань. Спробуй це. Якщо це насправді працює для вас, то, будь ласка, опублікуйте, які поточні налаштування мови. Дякую. Ось код, який потрібно спробувати ... ВИБЕРІТЬ КОНВЕРТ (DateTime, '24 .04.2012 ', 121) ЯК ExpireDate
Jeff Moden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.