2009-12-17 29 views
38

Duplicar posibles:
Create a date with T-SQLSQL Server: convertir ((int) años, (int) meses, (int) días) de fecha y hora a

Tengo una tabla de datos que almacena cada uno año, mes y día como valor enteros:

year | month | day 
2009 | 1 | 1 
2008 | 12 | 2 
2007 | 5 | 5 

necesito para convertirlo en valor de fecha y hora, porque tengo que usarlo en una fecha y hora entre la operación. ¿Cómo podría hacer esto?

+0

esto se ha preguntado un par de veces. Consulte http://stackoverflow.com/questions/266924/create-a-date-with-t-sql – womp

Respuesta

64

Con el fin de ser independiente de la configuración de idioma y la configuración regional, se debe utilizar la norma ISO 8601 YYYYMMDD formato - esto funcionará en cualquier sistema de SQL Server con cualquier idioma y configuración regional en efecto:

SELECT 
    CAST(
     CAST(year AS VARCHAR(4)) + 
     RIGHT('0' + CAST(month AS VARCHAR(2)), 2) + 
     RIGHT('0' + CAST(day AS VARCHAR(2)), 2) 
    AS DATETIME) 
+0

gracias, lo hice de esa manera también. – balint

+1

¡YYYYMMDD funciona como magia! – LaBracca

+0

No funciona con Firebird 2.5, pero 'YYYY-MM-DD' hace – Fr0sT

2
SELECT CAST(CAST(year AS varchar) + '/' + CAST(month AS varchar) + '/' + CAST(day as varchar) AS datetime) AS MyDateTime 
FROM table 
+4

que es una mala idea, esto depende de la configuración local para su formato de fecha. –

+1

@marc_s entendido, pero dependiendo de sus necesidades de implementación, puede ser un punto de silencio. –

+2

naw. Si se trata de una consulta ad hoc de una sola vez, podría ver su punto. Pero no en un procedimiento almacenado. marc_s tiene un buen punto! – TamusJRoyce

7

se puede convertir sus valores en una fecha y hora 'decimal' y convertirlo luego a una columna de fecha y hora reales:

select cast(rtrim(year *10000+ month *100+ day) as datetime) as Date from DateTable 

Ver here también para más información.

+0

Esta es la mejor respuesta –

36

solución de fecha y hora pura, no depende de la lengua o DATEFORMAT, sin condiciones

SELECT 
    DATEADD(year, [year]-1900, DATEADD(month, [month]-1, DATEADD(day, [day]-1, 0))) 
FROM 
    dbo.Table 
+0

Esto requiere que SQL se configure con 1900 como fecha base aunque –

+0

@AdriaanDavel SQL Server (las etiquetas de pregunta) es * siempre * fecha base 01 Jan 1900 . https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql ver "valor predeterminado". – gbn