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).

cja
fuente
@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) 
John Woo
fuente
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 .

Jeremy1026
fuente
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'
Todd.J.Hayden
fuente
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
g2server
fuente
¿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

Rajsanthosh Sreenivasan
fuente
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'

Jamie Marshall
fuente
0

Prueba a continuación:

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

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
Gaurav123
fuente
1
Bueno !! ¿Necesitamos escribir también a la IZQUIERDA?
Gaurav123
Toma 10 primeros caracteres, así que si lo necesitas, solo quieres la fecha.
ram4nd