2012-04-24 2 views

ответ

102
CONVERT(datetime, '24.04.2012', 104) 

Если сделать трюк. Смотрите здесь для получения дополнительной информации: "CAST and CONVERT (Transact-SQL)"

+3

Не работает. TSQL показывает эту ошибку: неправильный синтаксис рядом с ключевым словом «CONVERT». – pordi

+0

Удалите пространство между CONVERT и parn's: CONVERT (datetime, '24 .04.2012 ', 104) – MAbraham1

+0

Как поясняется в связанном документе, «104» указывает на форматирование входной строки. – DCShannon

24

Microsoft SQL Date Formats

CONVERT(DateTime, DateField, 104) 
+0

'24-04- 2012' не будет признанный как действительная дата, потому что он будет ожидать 'MM-dd-yyyy' – Khan

+2

как насчет' CONVERT (DateTime, DateField, 104) '? Это должно сказать sql-серверу использовать формат dd.mm.yyyy ... – therealmitchconnors

+0

Да, это работает, я тоже нашел, спасибо! –

6

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

+3

Что касается ситуации, когда вы импортируете файлы данных из какой-либо внешней системы, а входной столбец находится в одном из этих форматов, например.«05/31/2013», но который входит в строку? И вы пишете, скажем, хранимую процедуру для импорта этих данных или используя SSIS для ее импорта? Тогда CONVERT будет подходящей вещью для использования, не так ли? –

+0

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

+0

Формат строкового литерала по умолчанию для даты - [ГГГГ-ММ-ДД] (https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql) –

10

Вот решение, которое хорошо работает. Основное утверждение содержит разбор Try-рядный:

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:

+0

Мы используем этот в производственном кодексе. – MAbraham1

0
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate 

будет делать то, что требуется, результат:

2012-04-24 00:00:00.000 
Смежные вопросы