Как разобрать строку на дату?


Ответы:




21

Предполагая, что база данных - это MS SQL Server 2012 или выше, вот решение, которое работает. Базовый оператор содержит встроенный try-parse:

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:


Это предполагает, что OP использует Sql Server 2012+
Марк Крам

8

Хотя функция CONVERT работает, вам не следует ее использовать. Вы должны спросить себя, почему вы анализируете строковые значения в SQL-Server. Если это одноразовая работа, когда вы вручную исправляете некоторые данные, вы не получите эти данные в другой раз, это нормально, но если какое-либо приложение использует это, вам следует что-то изменить. Лучше всего использовать тип данных «дата». Если это пользовательский ввод, это еще хуже. Затем вы должны сначала проверить клиента. Если вы действительно хотите передавать строковые значения там, где SQL-сервер ожидает дату, вы всегда можете использовать формат ISO ('ГГГГММДД'), и он должен преобразоваться автоматически.


5
А как насчет ситуации, когда вы импортируете файлы данных из какой-то внешней системы, а входной столбец находится в одном из этих форматов, например «31.05.2013», но в виде строки? И вы пишете, скажем, хранимую процедуру для импорта этих данных или используете SSIS для их импорта? Тогда CONVERT было бы подходящей вещью для использования, не так ли?
Дэвид Бэрроуз

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

Формат строкового литерала по умолчанию для дат - ГГГГ-ММ-ДД
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

сделаю то, что нужно, результат:

2012-04-24 00:00:00.000

Похоже, что это не работает для того, что опубликовал OP даже для разных языковых настроек. Попытайся. Если это действительно работает для вас, опубликуйте, какой у вас текущий язык. Спасибо. Вот код, который стоит попробовать ... ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Джефф Моден,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.