Cómo convertir una fecha y hora en una cadena en T-SQL


91

Me sorprende no poder encontrar esta pregunta aquí ya.

Tengo una var de fecha y hora y quiero convertirla en una cadena para poder agregarla a otra cadena. Lo quiero en un formato que se pueda convertir fácilmente a una fecha y hora.

¿Cómo puedo hacer esto?

(Quiero la parte de la fecha y la parte del tiempo).


@TonyHopkinson También obtuve muchos hits, pero todos parecían estar convirtiéndose al revés. O queriendo algo más complicado.
— cja

3
Escriba Convert, haga doble clic para resaltar, presione Shift + F1 ... siempre la primera línea de defensa.
— Eric J. Price

Respuestas:


156

La siguiente consulta obtendrá la fecha y hora actual y la convertirá en una cadena. con el siguiente formato
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 

49
Todavía no puedo superar el hecho de que tienes que pasar números arbitrarios para obtener el formato correcto
— cja

4
@cja Comparto totalmente tu sorpresa. Quiero proporcionar una cadena, como yyddss, para obtener el formato exacto que quiero. Probablemente haya una razón técnica o histórica para esto. Pero aún así, muy sorprendente.
— Konrad Viltersten

2
Gracias por la solución rápida, pero en su respuesta está codificando los meses como minutos, aaaa-MM-dd hh: mm: ss NO aaaa-mm-dd hh: mm: ss
— Tom Martin

Aunque esto es antiguo, acabo de encontrarme con este hilo. Cuando lo use DateTimeOffSet, asegúrese de ajustar la varcharlongitud a cómo desea que se vea el resultado. Para mí, no quería la zona horaria, así que tuve que usarSELECT convert(varchar(19), sysdatetimeoffset(), 120)
— RoLYroLLs


7

Puede utilizar la convertinstrucción en Microsoft SQL Server para convertir una fecha en una cadena. Un ejemplo de la sintaxis utilizada sería:

SELECT convert(varchar(20), getdate(), 120)

Lo anterior devolvería la fecha y hora actuales en una cadena con el formato de YYYY-MM-DD HH:MM:SSreloj de 24 horas.

Puede cambiar el número al final de la declaración a uno de muchos que cambiarán el formato de las cadenas devueltas. Puede encontrar una lista de estos códigos en MSDN en la sección de referencia CAST y CONVERT .


7

Hay 3 métodos diferentes dependiendo de cuál sea mi requerimiento y qué versión estoy usando.

Estos son los métodos ...

1) Usando Convertir

DECLARE @DateTime DATETIME = GETDATE();
--Using Convert
SELECT
    CONVERT(NVARCHAR, @DateTime,120) AS 'myDateTime'
    ,CONVERT(NVARCHAR(10), @DateTime, 120) AS 'myDate'
    ,RIGHT(CONVERT(NVARCHAR, @DateTime, 120),8) AS 'myTime'

2) Uso de Cast (SQL Server 2008 y posteriores)

SELECT
    CAST(@DateTime AS DATETIME2) AS 'myDateTime'
    ,CAST(@DateTime AS DATETIME2(3)) AS 'myDateTimeWithPrecision'
    ,CAST(@DateTime AS DATE) AS 'myDate'
    ,CAST(@DateTime AS TIME) AS 'myTime'
    ,CAST(@DateTime AS TIME(3)) AS 'myTimeWithPrecision'

3) Uso del tipo de datos de caracteres de longitud fija

DECLARE @myDateTime NVARCHAR(20) = CONVERT(NVARCHAR, @DateTime, 120);
DECLARE @myDate NVARCHAR(10) = CONVERT(NVARCHAR, @DateTime, 120);

SELECT
    @myDateTime AS 'myDateTime'
    ,@myDate AS 'myDate'

5

Además de las funciones CASTy CONVERTde las respuestas anteriores, si está utilizando SQL Server 2012 y superior, utiliza la función FORMAT para convertir un DATETIMEtipo basado en una cadena.

Para volver a convertir, use el opuesto PARSEoTRYPARSE funciones .

Los estilos de formato se basan en .NET (similar a las opciones de formato de cadena del método ToString ()) y tiene la ventaja de ser consciente de la cultura. p.ej.

DECLARE @DateTime DATETIME2 = SYSDATETIME();
DECLARE @StringResult1 NVARCHAR(100) = FORMAT(@DateTime, 'g') --without culture
DECLARE @StringResult2 NVARCHAR(100) = FORMAT(@DateTime, 'g', 'en-gb') 
SELECT @DateTime
SELECT @StringResult1, @StringResult2
SELECT PARSE(@StringResult1 AS DATETIME2)
SELECT PARSE(@StringResult2 AS DATETIME2 USING 'en-gb')

Resultados:

2015-06-17 06:20:09.1320951
6/17/2015 6:20 AM
17/06/2015 06:20
2015-06-17 06:20:00.0000000
2015-06-17 06:20:00.0000000

¿Me falta algo o el problema de OP se resuelve con FORMAT (<date var>, 'dd MMMM aaaa HH: mm: ss') o cualquier formato de fecha personalizado que necesite?
— Grim

@Grim, tú también puedes hacer eso. De los documentosThe format argument must contain a valid .NET Framework format string, either as a standard format string (for example, "C" or "D"), or as a pattern of custom characters for dates and numeric values (for example, "MMMM DD, yyyy (dddd)")
— g2server

Creo que en realidad estás trabajando demasiado aquí. SQL Server tiene equivalentes de cadena implícitos para DATETIME2. Lo que realmente está haciendo aquí es utilizar la conversión implícita y luego formatear la cadena resultante, no la fecha y hora.
— Jamie Marshall

@JamieMarshall más o menos. MSDN sugiere:Use the FORMAT function for locale-aware formatting of date/time and number values as strings. For general data type conversions, use CAST or CONVERT.
— g2server


1
SELECT CONVERT(varchar, @datetime, 103) --for UK Date format 'DD/MM/YYYY'

101 - EE. UU. - MM / DD / AAAA

108 - Hora - HH: MI: SS

112 - Fecha - AAAAMMDD

121 - ODBC - AAAA-MM-DD HH: MI: SS.FFF

20 - ODBC - AAAA-MM-DD HH: MI: SS


1

Esto ha sido respondido por mucha gente, pero siento que la solución más simple ha quedado fuera.

SQL SERVER (creo que su 2012+) tiene equivalentes de cadena implícitos para DATETIME2 como se muestra aquí

Consulte la sección sobre "Formatos literales de cadena admitidos para datetime2".

Para responder explícitamente a la pregunta de los OP:

DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

salida:

Jan 23 2019 12:24PM             
2019-01-23 12:24:00.0000000

Nota: La primera variable ( myVar) también contiene el valor '2019-01-23 12:24:00.0000000'. Simplemente se formatea Jan 23 2019 12:24PMdebido al formato predeterminado establecido para SQL SERVER que se llama cuando lo usa PRINT. No se tropiece aquí con eso, la cadena real en (myVer)='2019-01-23 12:24:00.0000000'


0

Prueba a continuación:

DECLARE @myDateTime DATETIME
SET @myDateTime = '2013-02-02'

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

1
Bueno !! ¿Necesitamos escribir también a la IZQUIERDA?
— Gaurav123

Toma 10 primeros caracteres, así que si lo necesitas, solo quieres la fecha.
— ram4nd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.