yyyy - Convierta varchar en datetime en SQL Server
convert varchar to datetime sql server yyyymmdd (13)
Convertir sería la respuesta normal, pero el formato no es un formato reconocido para el convertidor, mm / dd / aaaa podría convertirse usando convert (datetime, 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 nivel que el converso pueda comprender de entre los disponibles.
Hackeado juntos, si puedes garantizar 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)
¿Cómo convierto una cadena de formato mmddyyyy
en datetime
en SQL Server 2008?
Mi columna de destino está en DateTime
Lo he intentado con Convert
y con la mayoría de los valores de estilo de Date
, sin embargo recibo un mensaje de error:
''La conversión de un tipo de datos varchar a un tipo de datos datetime resultó en un valor fuera de rango.''
Creo que CONVERT es la mejor opción, ya que puedes incluir un estilo (formato de fecha), por lo que el valor predeterminado de EE. UU. Sería 110, que es mm-dd-aaaa.
Encontré esto útil para mi conversión, sin manipulación de cadenas. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
CONVERT(VARCHAR(23), @lastUploadEndDate, 121)
aaaa-mm-dd hh: mi: ss.mmm (24h) era el formato que necesitaba.
Es probable que tengas datos malos que no se pueden 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.
De acuerdo, probé con buenos datos conocidos y aún recibí el mensaje. Necesita convertir a un formato diferente porque no sabe si 12302009 es mmddyyyy o ddmmyyyy. El formato de aaaammdd no es ambiguo y SQL Server lo convertirá correctamente
Tengo esto para trabajar:
cast( right(@date,4) + left(@date,4) as datetime)
Sin embargo, recibirá un mensaje de error si tiene alguno que se encuentre en un formato no estándar como ''112009'' o algún valor de texto o una fecha fuera de rango real.
Esta parece la forma más fácil ...
SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),''-'','''')
La causa principal de este problema puede estar en la configuración regional: DB esperando YYYY-MM-DD mientras se encuentra una aplicación, por ejemplo, DD-MM-YYYY (formato de configuración regional en ruso) tal como estaba 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à.
Las fechas estándar de SQL durante la inserción o actualización deben estar entre 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 PM.
Entonces, si está insertando / actualizando debajo del 1/1/1753, obtendrá este error.
Mire CAST
/ CONVERT
en BOL que debería ser un comienzo.
Si su columna de destino es de datetime
y datetime
, no necesita convertirla, SQL lo hará por usted.
De otra manera
CONVERT(datetime, ''20090101'')
Deberías hacerlo.
Este es un link que también debería ayudar:
OP quiere mmddyy y una conversión simple no funcionará para eso:
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
así que prueba 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)
SQL Server puede convertir implícitamente cadenas en forma de ''AAAAMMDD'' a una fecha y hora; todas las demás cadenas deben emitirse explícitamente. aquí hay dos bloques de código rápido que harán la conversión desde el formulario del que está hablando:
la versión 1 usa variables unitarias:
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
la versión 2 no usa 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.
Tuve suerte con algo similar:
Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + ''/'' + CONVERT(VARCHAR(2), @Day)
+ ''/'' + CONVERT(VARCHAR(4), @Year))
Yo 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)
Primero usa dos veces STUFF
para obtener 11/12/90 en vez de 111290, que usa el 3 para convertir esto a datetime
y datetime
(o cualquier otro formato de ajuste: use .
Para alemán, -
para británico ...) Más detalles sobre CAST and CONVERT
Lo mejor fue almacenar correctamente los valores de fecha y hora.
- Esto debería ser "formato universal no
yyyyMMdd
"yyyyMMdd
- o (especialmente dentro de XML) debería ser ISO8601:
yyyy-MM-dd
oyyyy-MM-ddThh:mm:ss
Más detalles sobre ISO8601
Cualquier formato específico de cultura generará problemas tarde o temprano ...
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)