Преобразование varchar в datetime в SQL Server
Как преобразовать строку формата mmddyyyy
в datetime
в SQL Server 2008?
Мой целевой столбец находится в datetime
Я пробовал с Convert
и большинством значений стиля Date
, однако я получаю сообщение об ошибке:
'Преобразование типа данных varchar в тип данных datetime приводило к значению вне диапазона.'
Ответы
Ответ 1
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)
Ответ 2
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 date
SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)
SELECT @output = @[email protected][email protected]
SELECT @output
END
версия 2 не использует единичные переменные:
BEGIN
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today date
SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)
SELECT @output
END
Оба случая полагаются на способность SQL-сервера делать это неявное преобразование.
Ответ 3
Преобразование будет обычным ответом, но формат не является признанным форматом для конвертера, 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)
Ответ 4
Вероятно, у вас есть плохие данные, которые невозможно преобразовать. Даты никогда не должны храниться в varchar, потому что это даёт такие даты, как ASAP или 02/30/2009. Используйте функцию isdate() в своих данных, чтобы найти записи, которые невозможно преобразовать.
OK Я проверил с известными хорошими данными и все еще получил сообщение. Вам нужно преобразовать в другой формат, потому что он не знает, является ли 12302009 mmddyyyy или ddmmyyyy. Формат yyyymmdd не является двусмысленным, и SQL Server будет его правильно преобразовывать.
Я получил это для работы:
cast( right(@date,4) + left(@date,4) as datetime)
Вы все равно получите сообщение об ошибке, хотя, если у вас есть какие-либо, которые находятся в нестандартном формате, например, "112009" или какое-либо текстовое значение или истинная дата вне диапазона.
Ответ 5
Я нашел это полезным для моего преобразования, без манипуляции с строкой. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
CONVERT(VARCHAR(23), @lastUploadEndDate, 121)
yyyy-mm-dd hh: mi: ss.mmm(24h) был форматом, который мне нужен.
Ответ 6
Посмотрите CAST
/CONVERT
в BOL, который должен начинаться.
Если ваш целевой столбец datetime
вам не нужно его преобразовывать, SQL сделает это за вас.
В противном случае
CONVERT(datetime, '20090101')
Должно это сделать.
Это ссылка, которая также должна помочь:
Ответ 7
Мне повезло с чем-то подобным:
Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
Ответ 8
Я бы использовал 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
Любой формат, специфичный для конкретной культуры, рано или поздно приведет к проблемам...
Ответ 9
Я думаю, что CONVERT - лучший выбор, поскольку вы можете включить стиль (формат даты), поэтому для США по умолчанию будет 110, который равен mm-dd-yyyy.
Ответ 10
Основная причина этой проблемы может быть в региональных настройках - DB ожидает YYYY-MM-DD, когда приложение передает, например, DD-MM-YYYY (русский язык), как это было в моем случае. Все, что я сделал - изменить языковой формат с русского на английский (США) и вуаля.
Ответ 11
Это кажется самым простым способом.
SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
Ответ 12
Стандартные даты SQL при вставке или обновлении Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.
Итак, если вы вставляете/обновляете ниже 1/1/1753, вы получите эту ошибку.
Ответ 13
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)