Преобразование varchar в datetime в SQL Server


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

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

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

'преобразование типа данных varchar в тип данных datetime в результате вне диапазона значение.-

13 58

13 ответов:

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)

SQL Server может неявно приводить строки в виде 'YYYYMMDD' к datetime - все остальные строки должны быть явно приведены. вот два быстрых блока кода, которые будут делать преобразование из формы, о которой вы говорите:

Версия 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 выполнять это неявное преобразование.

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

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

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

преобразование было бы нормальным ответом, но формат не является распознанным форматом для конвертера,mm/dd/yyyy может быть преобразован с помощью 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)

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

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

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

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

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

посмотреть CAST/CONVERT в боле это должно быть началом.

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

иначе

CONVERT(datetime, '20090101')

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

это ссылке это тоже должно помочь:

Мне повезло с чем-то подобным:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))

Я хотел бы использовать 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

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

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

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

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

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

Я думаю, что CONVERT-лучший выбор, поскольку вы можете включить стиль (формат даты), поэтому по умолчанию в США будет 110, который является mm-dd-yyyy.

первопричина этой проблемы может быть в региональных настройках-DB ждет YYYY-MM-DD, пока приложение отправит, например, DD-MM-YYYY (формат русского языка), как это было в моем случае. Все, что я сделал - изменил формат локали с русского на английский (США) и вуаля.

это кажется самым простым способом..

SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')

стандартные даты в SQL при вставке или обновлении должны быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 вечера.

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