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

85

Как преобразовать строку в дату в T-SQL?

Мой тестовый пример - это строка: '24.04.2012'

Назар Терешкович
источник

Ответы:

136
CONVERT(datetime, '24.04.2012', 104)

Должен сделать свое дело. См. Здесь для получения дополнительной информации: CAST и CONVERT (Transact-SQL)

Крис Робертс
источник
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:

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

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

Эрик
источник
5
А как насчет ситуации, когда вы импортируете файлы данных из какой-то внешней системы, а входной столбец находится в одном из этих форматов, например «31.05.2013», но в виде строки? И вы пишете, скажем, хранимую процедуру для импорта этих данных или используете SSIS для их импорта? Тогда CONVERT было бы подходящей вещью для использования, не так ли?
Дэвид Бэрроуз
Не обязательно, в ситуациях, когда MS SQL Server размещает аналитические модели данных, в отличие от моделей транзакций, совершенно нормально использовать CONVERT, потому что он должен иметь дело с множеством внешних источников, которые не будут легко входить в качестве типа даты. (как упоминал Дэвид Бэрроуз выше).
Будет
Формат строкового литерала по умолчанию для дат - ГГГГ-ММ-ДД
YB
4

Ты можешь использовать:

SELECT CONVERT(datetime, '24.04.2012', 103) AS Date

Ссылка: CAST и CONVERT (Transact-SQL)

Шонн Александр
источник
Интересно, что работает. Формат 103 - дд / мм / гггг, а 104 - дд.мм.гггг.
Джефф Моден,
1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

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

2012-04-24 00:00:00.000
JMMS Karunarathne
источник
Похоже, что это не работает для того, что опубликовал OP даже для разных языковых настроек. Попытайся. Если это действительно работает для вас, опубликуйте, какой у вас текущий язык. Спасибо. Вот код, который стоит попробовать ... ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Джефф Моден,