Cómo convertir DateTime a VarChar


303

Estoy trabajando en una consulta en Sql Server 2005 donde necesito convertir un valor en DateTimevariable en una varcharvariable en yyyy-mm-ddformato (sin parte de tiempo). ¿Cómo puedo hacer eso?


1
CONVERT, consulte la documentación de MSDN .
Jason Cohen

3
tenga en cuenta que AAAA-MM-DD es ambiguo, según la configuración de idioma. mejor usar el estándar ISO AAAAMMDD, vea esta publicación de blog
Andy Irving

Respuestas:


262

Con Microsoft Sql Server:

--
-- Create test case
--
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

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

12
Para aquellos de ustedes que puedan estar interesados, esto funcionaría mejor si cambian VARCHAR a CHAR. Consulte esta publicación ( stackoverflow.com/questions/59667/… ) para obtener más detalles. Esencialmente, hay 2 bytes de sobrecarga involucrados en VARCHAR vs CHAR. En este escenario, sabemos que su cadena siempre tendrá 10 caracteres, por lo que CHAR es apropiado.
Will Ediger

1
Nota al margen, por lo que he visto, lástima que ninguno de los formatos rinda homenaje a lo que esté configurado el DATEFORMAT, tal vez haya otra forma.
Alex Nolasco

3
¿Hay alguna razón para usar en LEFT(.., 10)lugar de CONVERT(CHAR(10), ...)? También aquellos que trabajan con las versiones más nuevas de SQL Server que 2005 (!) Deben consultar la respuesta de Zar Shardan que sugiere una solución basada en la FORMAT(date_value, format_string)función.
Nickolay

@Nickolay además FORMAT()es demasiado lento en relación conconvert(char(10),...)
abdul qayyum

380

Aquí hay algunos sql de prueba para todos los estilos.

DECLARE @now datetime
SET @now = GETDATE()
select convert(nvarchar(MAX), @now, 0) as output, 0 as style 
union select convert(nvarchar(MAX), @now, 1), 1
union select convert(nvarchar(MAX), @now, 2), 2
union select convert(nvarchar(MAX), @now, 3), 3
union select convert(nvarchar(MAX), @now, 4), 4
union select convert(nvarchar(MAX), @now, 5), 5
union select convert(nvarchar(MAX), @now, 6), 6
union select convert(nvarchar(MAX), @now, 7), 7
union select convert(nvarchar(MAX), @now, 8), 8
union select convert(nvarchar(MAX), @now, 9), 9
union select convert(nvarchar(MAX), @now, 10), 10
union select convert(nvarchar(MAX), @now, 11), 11
union select convert(nvarchar(MAX), @now, 12), 12
union select convert(nvarchar(MAX), @now, 13), 13
union select convert(nvarchar(MAX), @now, 14), 14
--15 to 19 not valid
union select convert(nvarchar(MAX), @now, 20), 20
union select convert(nvarchar(MAX), @now, 21), 21
union select convert(nvarchar(MAX), @now, 22), 22
union select convert(nvarchar(MAX), @now, 23), 23
union select convert(nvarchar(MAX), @now, 24), 24
union select convert(nvarchar(MAX), @now, 25), 25
--26 to 99 not valid
union select convert(nvarchar(MAX), @now, 100), 100
union select convert(nvarchar(MAX), @now, 101), 101
union select convert(nvarchar(MAX), @now, 102), 102
union select convert(nvarchar(MAX), @now, 103), 103
union select convert(nvarchar(MAX), @now, 104), 104
union select convert(nvarchar(MAX), @now, 105), 105
union select convert(nvarchar(MAX), @now, 106), 106
union select convert(nvarchar(MAX), @now, 107), 107
union select convert(nvarchar(MAX), @now, 108), 108
union select convert(nvarchar(MAX), @now, 109), 109
union select convert(nvarchar(MAX), @now, 110), 110
union select convert(nvarchar(MAX), @now, 111), 111
union select convert(nvarchar(MAX), @now, 112), 112
union select convert(nvarchar(MAX), @now, 113), 113
union select convert(nvarchar(MAX), @now, 114), 114
union select convert(nvarchar(MAX), @now, 120), 120
union select convert(nvarchar(MAX), @now, 121), 121
--122 to 125 not valid
union select convert(nvarchar(MAX), @now, 126), 126
union select convert(nvarchar(MAX), @now, 127), 127
--128, 129 not valid
union select convert(nvarchar(MAX), @now, 130), 130
union select convert(nvarchar(MAX), @now, 131), 131
--132 not valid
order BY style

Aquí está el resultado.

output                   style
Apr 28 2014  9:31AM          0
04/28/14                     1
14.04.28                     2
28/04/14                     3
28.04.14                     4
28-04-14                     5
28 Apr 14                    6
Apr 28, 14                   7
09:31:28                     8
Apr 28 2014  9:31:28:580AM   9
04-28-14                     10
14/04/28                     11
140428                       12
28 Apr 2014 09:31:28:580     13
09:31:28:580                 14
2014-04-28 09:31:28          20
2014-04-28 09:31:28.580      21
04/28/14  9:31:28 AM         22
2014-04-28                   23
09:31:28                     24
2014-04-28 09:31:28.580      25
Apr 28 2014  9:31AM          100
04/28/2014                   101
2014.04.28                   102
28/04/2014                   103
28.04.2014                   104
28-04-2014                   105
28 Apr 2014                  106
Apr 28, 2014                 107
09:31:28                     108
Apr 28 2014  9:31:28:580AM   109
04-28-2014                   110
2014/04/28                   111
20140428                     112
28 Apr 2014 09:31:28:580     113
09:31:28:580                 114
2014-04-28 09:31:28          120
2014-04-28 09:31:28.580      121
2014-04-28T09:31:28.580      126
2014-04-28T09:31:28.580      127
28 جمادى الثانية 1435  9:31:28:580AM    130
28/06/1435  9:31:28:580AM    131

Haga nvarchar(max)más corto para recortar el tiempo. Por ejemplo:

select convert(nvarchar(11), GETDATE(), 0)
union select convert(nvarchar(max), GETDATE(), 0)

salidas:

May 18 2018
May 18 2018  9:57AM

Aquí a veces queremos como dd-mmo jun - 28. ¿Hay alguna opción?
Rock

Funciona para SQL Server 2005, por lo que es ideal para aquellos de nosotros que desafortunadamente todavía nos estamos entrometiendo con sistemas más antiguos. Actualizando a 2014 pronto, ¡emocionado!
dyslexicanaboko

Quiero formatear cerca de 101-101 = 28/04/2014, quiero sin cero en el mes, salida 28/04/2014, ¿es aplicable?
Ahmed abdelqader

1
¿No falta el identificador de zona horaria Z en el estilo 127.
Atishay

@Atishay "solo se admite cuando se transmite desde datos de caracteres a datetime o smalldatetime". Vea las notas al pie 6 y 7 en docs.microsoft.com/de-de/sql/t-sql/functions/…
Colin



9

Puedes usar DATEPART(DATEPART, VARIABLE). Por ejemplo:

DECLARE @DAY INT 
DECLARE @MONTH INT
DECLARE @YEAR INT
DECLARE @DATE DATETIME
@DATE = GETDATE()
SELECT @DAY = DATEPART(DAY,@DATE)
SELECT @MONTH = DATEPART(MONTH,@DATE)
SELECT @YEAR = DATEPART(YEAR,@DATE)


6

- Esto le da el tiempo como 0 en formato 'aaaa-mm-dd 00: 00: 00.000'


SELECT CAST( CONVERT(VARCHAR, GETDATE(), 101) AS DATETIME) ; 

5

Con Microsoft SQL Server:

Utilice la sintaxis para CONVERTIR:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Ejemplo:

SELECT CONVERT(varchar,d.dateValue,1-9)

Para el estilo, puede encontrar más información aquí: MSDN - Cast and Convert (Transact-SQL) .




3
declare @dt datetime

set @dt = getdate()

select convert(char(10),@dt,120) 

He corregido la longitud de los datos, char(10)ya que desea un formato de cadena específico.


2

El OP mencionó el formato de fecha y hora . Para mí, la parte del tiempo se interpone en el camino.
Creo que es un poco más limpio eliminar la porción de tiempo (enviando datetime a date) antes de formatear.

convert( varchar(10), convert( date, @yourDate ) , 111 )

2

Así es como lo hago: CONVERT(NVARCHAR(10), DATE1, 103) )


2

Puede convertir su fecha en muchos formatos, la sintaxis es fácil de usar:

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
  • El código es un número entero, aquí 3 es el tercer formato sin siglo, si desea el siglo simplemente cambie el código a 103.

En su caso , acabo de convertir y restringir el tamaño por nvarchar (10) de esta manera:

CONVERT(NVARCHAR(10), MY_DATE_TIME, 120) => 2016-09-15

Ver más en: http://www.w3schools.com/sql/func_convert.asp

Otra solución (si su fecha es Datetime) es un CAST simple :

CAST(MY_DATE_TIME as DATE) => 2016-09-15

2

Prueba este SQL:

select REPLACE(CONVERT(VARCHAR(24),GETDATE(),103),'/','_') + '_'+ 
       REPLACE(CONVERT(VARCHAR(24),GETDATE(),114),':','_')

2

Para SQL Server 2008+ Puede usar CONVERTIR y FORMAR juntos.

Por ejemplo, para la marca de tiempo de estilo europeo (por ejemplo, Alemania):

CONVERT(VARCHAR, FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss', 'de-DE'))

1

No dijo qué base de datos, pero con mysql aquí hay una manera fácil de obtener una fecha de una marca de tiempo (y la conversión del tipo varchar debería ocurrir automáticamente):

mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2008-09-16  | 
+-------------+
1 row in set (0.00 sec)

1
Verifique nuevamente: especificó el servidor SQL a través de una etiqueta.
Joel Coehoorn

1

La forma más corta y simple es:

DECLARE @now AS DATETIME = GETDATE()

SELECT CONVERT(VARCHAR, @now, 23)

1
DECLARE @DateTime DATETIME
SET @DateTime = '2018-11-23 10:03:23'
SELECT CONVERT(VARCHAR(100),@DateTime,121 )


0

Escribir una función

CREATE FUNCTION dbo.TO_SAP_DATETIME(@input datetime)
RETURNS VARCHAR(14)
AS BEGIN
    DECLARE @ret VARCHAR(14)
    SET @ret = COALESCE(SUBSTRING(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(26), @input, 25),'-',''),' ',''),':',''),1,14),'00000000000000');
    RETURN @ret
END

0
select REPLACE(CONVERT(VARCHAR, FORMAT(GETDATE(), N'dd/MM/yyyy hh:mm:ss tt')),'.', '/')

dará 05/05/2020 10:41:05 AMcomo resultado


-3

No dice qué idioma, pero supongo C#/.NETque tiene un DateTimetipo de datos nativo . En ese caso, simplemente conviértalo usando el ToStringmétodo y use un especificador de formato como:

DateTime d = DateTime.Today;
string result = d.ToString("yyyy-MM-dd");

Sin embargo, advertiría contra el uso de esto en una consulta de base de datos o concatenado en una declaración SQL. Las bases de datos requieren una cadena de formato específica para ser utilizada. Es mejor poner a cero la parte de tiempo y usar DateTime como parámetro SQL si eso es lo que está tratando de lograr.


En la pregunta, se menciona "Estoy trabajando en una consulta en SQL Server 2005".
InkHeart

44
@InkHeart y todos los votantes negativos: esta respuesta se publicó en 2008. Si revisa el historial de ediciones de la pregunta original, no se incluyeron etiquetas ni ninguna otra información relacionada con la tecnología.
GSazheniuk
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.