Преобразование 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.