2008-09-16 29 views
226

Estoy trabajando en una consulta en Sql Server 2005 donde necesito convertir un valor en la variable DateTime en una variable varchar en formato yyyy-mm-dd (sin parte de tiempo). ¿Cómo puedo hacer eso?Cómo convertir DateTime a VarChar

Respuesta

199

con Microsoft SQL Server:

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

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

Para aquellos de ustedes que puedan estar interesados, esto funcionaría mejor si cambia VARCHAR a CHAR. Ver este post (http://stackoverflow.com/questions/59667/why-would-i-ever-pick-char-over-varchar-in-sql) para 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. –

+0

Nota al margen, por lo que he visto, es una lástima que ninguno de los formatos respete el DATEFORMAT, quizás haya otra manera. –

+0

¿Hay alguna razón para usar 'LEFT (.., 10)' en lugar de 'CONVERT (CHAR (10), ...)'? También aquellos que trabajan con las versiones más nuevas de SQL Server que en 2005 (!) Deben verificar [la respuesta de Zar Shardan] (http://stackoverflow.com/a/17713768/1026) sugiriendo una solución basada en 'FORMAT (date_value, format_string) 'función. – Nickolay

8

De cualquier Cast o Convert:

Sintaxis para CAST:

CAST (expression AS data_type [ (length) ]) 

Sintaxis para CONVERT:

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

http://msdn.microsoft.com/en-us/library/ms187928.aspx

En realidad, ya que solicitó un formato específico:

REPLACE(CONVERT(varchar(10), Date, 102), '.', '-') 
0

Usted no ha dicho qué base de datos, pero con MySQL aquí es una manera fácil de obtener una fecha a partir de una marca de tiempo (y la conversión de tipo varchar debería ocurrir automáticamente):

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

comprobar otra vez: se especifica el servidor SQL a través de una etiqueta. –

-3

Usted no dice qué idioma pero estoy asumiendo C#/.NET porque tiene un tipo de datos nativa DateTime. En ese caso, simplemente convertirlo usando el método ToString y utilizar un especificador de formato tales como:

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

Sin embargo, no sería recomendable el uso de esta en una consulta de base de datos o concatenan en una instrucción SQL. Las bases de datos requieren una cadena de formato específica para ser utilizada. Es mejor que ponga a cero la parte de tiempo y use DateTime como parámetro de SQL si eso es lo que está intentando lograr.

+0

En la pregunta, es mencionado "Estoy trabajando en una consulta en SQL Server 2005". – InkHeart

+3

@InkHeart y todos los votantes abajo - Esta respuesta fue publicada en 2008. Si marca la historia de las ediciones de la pregunta original no había etiquetas y/o cualquier otra información relacionada con la tecnología incluida. – GSazheniuk

10

tenga en cuenta que YYYY-MM-DD es ambiguo, según la configuración de idioma.mejor manera de utilizar la norma ISO estándar AAAAMMDD, ver longitud de datos this blog post

2
declare @dt datetime 

set @dt = getdate() 

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

He fijo de char(10) como desea un formato de cadena específica.

2

Probar:

select replace(convert(varchar, getdate(), 111),'/','-'); 

Más sobre ms sql tips

5

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


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

El OP mencionó datetime formato. 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 (fundiendo fecha y hora hasta la fecha) antes de formatear.

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

Con Microsoft SQL Server:

Uso Sintaxis para convertir:

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

Ejemplo:

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

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

7

Puede 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) 
1

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

261

He aquí algunos sql prueba para todos los estilos. Haga nvarchar(max) más corto para recortar (por ejemplo, nvarchar(10)).

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 
+0

Aquí algunas veces queremos como 'dd-mm' o' jun - 28'. Hay alguna opción? – JiLaBaJi

+0

Funciona para SQL Server 2005, así que esto es ideal para aquellos de nosotros que todavía estamos entrometiéndonos en sistemas antiguos. Actualizando a 2014 pronto, ¡emocionado! – dyslexicanaboko

+0

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

-1
CONVERT(VARCHAR, GETDATE(), 23) 
+0

No funciona en absoluto. – Daria

0

la más corta y la forma más sencilla es:

DECLARE @now AS DATETIME = GETDATE() 

SELECT CONVERT(VARCHAR, @now, 23) 
1

, pero puede cambiar la fecha en muchos formatos, la syntaxe 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 la tercera formateo sin siglo, si desea que el siglo que acaba de cambiar el código a 103.

En su caso, sólo he convertido y restringir 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

Un otra solución (si la fecha es una fecha y hora) es un simple REPARTO:

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

probar este SQL:

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