Преобразование varchar в datetime в SQL Server
как преобразовать строку формата mmddyyyy
на datetime
в SQL Server 2008?
мой целевой столбец в DateTime
Я пробовал с Convert
и самой Date
значения стиль, однако я получаю сообщение об ошибке:
'преобразование типа данных varchar в тип данных datetime в результате вне диапазона значение.-
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)
Я думаю, что CONVERT-лучший выбор, поскольку вы можете включить стиль (формат даты), поэтому по умолчанию в США будет 110, который является mm-dd-yyyy.