Конвертировать varchar в datetime в SQL Server - PullRequest
61 голосов
/ 02 октября 2009

Как преобразовать строку формата mmddyyyy в datetime в SQL Server 2008?

Мой целевой столбец в DateTime

Я пытался использовать Convert и большинство значений стиля Date, однако я получаю сообщение об ошибке:

'Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.'

Ответы [ 13 ]

72 голосов
/ 02 октября 2009

OP хочет mmddyy, и простое преобразование не будет работать для этого:

select convert(datetime,'12312009')

Msg 242, Level 16, State 3, Line 1 
The conversion of a char data type to a datetime data type resulted in 
an out-of-range datetime value

так попробуйте это:

DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))

ВЫВОД:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)
7 голосов
/ 02 октября 2009

SQL Server может неявно приводить строки в форме «ГГГГММДД» к дате и времени - все остальные строки должны быть явно приведены. Вот два блока быстрого кода, которые будут выполнять преобразование из формы, о которой вы говорите:

версия 1 использует единичные переменные:

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME

SET @input = '10022009'   --today's date


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)

SELECT @output = @year+@mon+@day 
SELECT @output 
END

версия 2 не использует единичные переменные:

BEGIN 
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)

SELECT @output
END

В обоих случаях используется способность сервера SQL Server выполнять это неявное преобразование.

5 голосов
/ 23 мая 2017

Я нашел это полезным для моего преобразования без манипуляций со строками. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

CONVERT(VARCHAR(23), @lastUploadEndDate, 121)

гггг-мм-дд чч: ми: сс.ммм (24 ч) был формат, который мне нужен

4 голосов
/ 02 октября 2009

Скорее всего, у вас плохие данные, которые невозможно преобразовать. Даты никогда не должны храниться в varchar, потому что это позволит такие даты, как ASAP или 30/02/2009. Используйте функцию isdate () для ваших данных, чтобы найти записи, которые не могут быть преобразованы.

ОК. Я проверил известные достоверные данные и все еще получил сообщение. Вам нужно конвертировать в другой формат, потому что он не знает, является ли 12302009 mmddyyyy или ddmmyyyy. Формат ггггммдд не является неоднозначным, и SQL Server преобразует его правильно

Я получил это на работу:

cast( right(@date,4) + left(@date,4) as datetime)

Вы все равно получите сообщение об ошибке, если у вас есть сообщение в нестандартном формате, например «112009», или какое-либо текстовое значение или истинная дата вне диапазона.

4 голосов
/ 02 октября 2009

Преобразование будет нормальным ответом, но формат не является распознанным форматом для преобразователя, мм / дд / гггг можно преобразовать с помощью функции convert (datetime, yourdatestring, 101), но у вас нет этого формата, поэтому он не работает.

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

Взломан вместе, если вы можете гарантировать формат

declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)
3 голосов
/ 02 октября 2009

Посмотрите на CAST / CONVERT в BOL, который должен быть началом.

Если целевой столбец равен datetime, вам не нужно преобразовывать его, SQL сделает это за вас.

В противном случае

CONVERT(datetime, '20090101')

Должен это сделать.

Это ссылка , которая также должна помочь:

1 голос
/ 08 августа 2016

use Try_Convert: возвращает приведение значения к указанному типу данных, если приведение выполнено успешно; в противном случае возвращает ноль.

DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)

SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)

Ссылка: MSDN TRY_CONVERT (Transact-SQL)

1 голос
/ 23 июня 2016

Я бы использовал STUFF для вставки разделительных символов и затем использовал CONVERT с соответствующим стилем. Примерно так:

DECLARE @dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3)

Сначала вы дважды используете STUFF, чтобы получить 11/12/90 вместо 111290, а затем 3 , чтобы преобразовать это в datetime (или любой другой подходящий формат: используйте . для немецкого, - для британского ...) Подробнее о CAST and CONVERT

Лучше всего было правильно хранить значения даты и времени.

  • Это должен быть либо "универсальный неразделенный формат" yyyyMMdd
  • или (особенно в XML) это должен быть ISO8601: yyyy-MM-dd или yyyy-MM-ddThh:mm:ss Подробнее о ISO8601

Любой специфический для данной культуры формат рано или поздно приведет к проблемам ...

1 голос
/ 02 июня 2010

Мне повезло с чем-то похожим:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
0 голосов
/ 20 августа 2012

Стандартные даты SQL при вставке или обновлении Должны быть между 01.01.1753 12:00:00 и 31.12.9999 11:59:59 PM.

Так что, если вы вставляете / обновляете ниже 01.01.1753, вы получите эту ошибку.

...