2009-10-02 37 views
56

¿Cómo convierto una cadena de formato mmddyyyy en datetime en SQL Server 2008?Convertir varchar en datetime en SQL Server

Mi columna de destino está en DateTime

He tratado con Convert y la mayoría de los valores de estilo Date sin embargo me aparece un mensaje de error:

'La conversión de un tipo de datos varchar a una fecha y hora tipo de datos resultó en un valor fuera de rango '.

+1

¿tsql tiene una función str_to_date como MySQL? http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date – dnagirl

+2

OP quiere mmddyyyy; select convert (datetime, '12312009') - >>> _ Msg 242, Level 16, State 3, Line 1 La conversión de un tipo de datos char a un tipo de datos datetime dio como resultado un valor de fecha y hora fuera de rango. –

Respuesta

63

PO quiere mmddaa y un convertido normal no funcionará para que:

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 

por lo intente esto:

DECLARE @Date char(8) 
set @Date='12312009' 
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2)) 

SALIDA:

----------------------- 
2009-12-31 00:00:00.000 

(1 row(s) affected) 
+2

+1, pero ¿no sería bueno no tener que empalmar cadenas? http://www.techonthenet.com/oracle/functions/to_date.php – dwerner

+9

@dwerner, si no quiere tener que hacer esas cosas, entonces no almacene en un tipo de datos incorrecto. – HLGEM

+2

Corrígeme si me equivoco, pero ese fue el problema propuesto por la pregunta. Mi sugerencia es usar una función adaptada al propósito. – dwerner

2

Mire CAST/CONVERT en BOL que debería ser un comienzo.

Si su columna de destino es datetime no necesita convertirla, SQL lo hará por usted.

De lo contrario

CONVERT(datetime, '20090101') 

debe hacerlo.

Esta es una link que deben ayudar así:

4

Convertir sería la respuesta normal, pero el formato no es un formato reconocido por el convertidor, dd/mm/aaaa podría ser convertido usando convertir (fecha y hora, yourdatestring, 101) pero no tiene ese formato por lo que falla.

El problema es que el formato no es estándar, tendrá que manipularlo a un estándar que el convertido pueda comprender de entre los disponibles.

hackeado, si se puede guarentee el formato

declare @date char(8) 
set @date = '12312009' 
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112) 
0

Creo CONVERTIR es la mejor opción, ya que puede incluir una (formato de fecha) el estilo, por lo que el valor predeterminado EE.UU. habría 110 que es mm-dd -yyyy

4

probable es que haya mala datos que no puede convertir Las fechas nunca deben almacenarse en varchar, ya que permitirán fechas como ASAP o el 30/02/2009. Use la función isdate() en sus datos para encontrar los registros que no se pueden convertir.

OK Probé con buenos datos conocidos y todavía recibí el mensaje. Necesita convertir a un formato diferente porque no sabe si 12302009 es mmddyyyy o ddmmyyyy.El formato de aaaammdd no es ambigua y SQL Server lo convertirá correctamente

Tengo que esto funcione:

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

seguirá recibiendo un mensaje de error aunque si usted tiene cualquiera que se encuentran en un no-estándar formato como '112009' o algún valor de texto o una fecha fuera de rango real.

6

SQL Server puede convertir implícitamente cadenas en forma de 'YYYYMMDD' en una fecha y hora; todas las demás cadenas deben emitirse explícitamente. aquí hay dos bloques de código rápidos que hacer la conversión de la forma que está hablando:

versión 1 utiliza variables unitarios:

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 = @[email protected][email protected] 
SELECT @output 
END 

versión 2 no utiliza variables de unidad:

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 

Ambos casos dependen de la capacidad del servidor SQL para realizar esa conversión implícita.

1

tuve suerte con algo similar:

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

La causa principal de este problema puede estar en la configuración regional - DB espera de AAAA-MM-DD, mientras que una aplicación senta, por ejemplo, DD-MM -YYYY (formato local ruso) como lo fue en mi caso. Todo lo que hice fue cambiar el formato de la configuración regional de ruso a inglés (Estados Unidos) y voilà.

0

Esta parece ser la forma más fácil ..

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

fechas estándar SQL al insertar o actualizar debe estar entre 1/1/1753 12:00:00 AM 12/31/9999 11:59:59 y PM.

Si está insertando/actualizando debajo del 1/1/1753 obtendrá este error.

1

Usaría STUFF para insertar caracteres divisorios y luego usar CONVERT con el estilo apropiado. Algo como esto:

DECLARE @dt VARCHAR(100)='111290'; 
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3) 

En primer lugar se utiliza dos veces para obtener STUFF 12/11/90 en lugar de 111.290, de las que usa el a convertir esto en datetime (o cualquier otro formato apropiado: utiliza para . alemán, - para los británicos ...) More details on CAST and CONVERT

Mejor fue, para almacenar los valores de fecha y hora correctamente.

  • Esto debe ser "formato no separado universal" yyyyMMdd
  • o (especialmente en XML) que debe ser ISO8601: yyyy-MM-dd o yyyy-MM-ddThh:mm:ssMore details on ISO8601

Cualquier cultura formato específico conducirá a problemas tarde o más tarde ...

0

use Try_Convert: Devuelve un valor de conversión al tipo de datos especificado si el lanzamiento tiene éxito; de lo contrario, devuelve nulo.

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

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

Enlace: MSDN TRY_CONVERT (Transact-SQL)

Cuestiones relacionadas