Подтвердить что ты не робот

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

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

Мой целевой столбец находится в datetime

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

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

4b9b3361

Ответ 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" или какое-либо текстовое значение или истинная дата вне диапазона.

Ответ 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)