Estoy tratando de convertir una fecha con partes individuales como 12, 1, 2007 en una fecha y hora en SQL Server 2005. He intentado lo siguiente:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
pero esto da como resultado una fecha incorrecta. ¿Cuál es la forma correcta de convertir los tres valores de fecha en un formato de fecha y hora adecuado?
sql
sql-server
sql-server-2005
tsql
Brandon
fuente
fuente
Respuestas:
Suponiendo que
y, m, d
son todosint
, ¿qué tal:Consulte mi otra respuesta para SQL Server 2012 y superior
fuente
yyyymmdd
formato funciona independientemente de esa configuración. "Una cadena de seis u ocho dígitos siempre se interpreta como ymd ". docs.microsoft.com/en-us/sql/t-sql/data-types/… Vea esta respuesta: stackoverflow.com/a/46064419/2266979Prueba esto:
Funciona también, tiene la ventaja añadida de no realizar conversiones de cadenas, por lo que es un procesamiento aritmético puro (muy rápido) y no depende de ningún formato de fecha. Esto aprovecha el hecho de que la representación interna de SQL Server para los valores de fecha y hora es un doble valor de la parte cuya primera parte es un número entero que representa el número de días desde el 1 de enero de 1900, y la segunda parte es una fracción decimal que representa la parte fraccional de un día (para el tiempo) --- Entonces el valor entero 0 (cero ) siempre se traduce directamente a la medianoche del 1 de enero de 1900 ...
o, gracias a la sugerencia de @brinary,
Editado en octubre de 2014. Como señaló @cade Roux, SQL 2012 ahora tiene una función incorporada:
DATEFROMPARTS(year, month, day)
hace lo mismo.
Editado el 3 de octubre de 2016, (Gracias a @bambams por notar esto, y @brinary por arreglarlo), La última solución, propuesta por @brinary. no parece funcionar durante los años bisiestos a menos que se realice primero la adición de años
fuente
@Year = 2001
, por ejemplo ,@Month = 13
y@DayOfMonth = 32
da como resultado2002-02-01T00:00:00.000
. La respuesta aceptada (por Cade Roux) genera un error, que es más útil.SQL Server 2012 tiene una nueva y maravillosa función DATEFROMPARTS (que generará un error si la fecha no es válida; mi principal objeción a una solución basada en DATEADD para este problema):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
o
fuente
O usando solo una única función dateadd:
fuente
SQL Server 2012 tiene una función que creará la fecha en función de las partes ( DATEFROMPARTS ). Para el resto de nosotros, aquí hay una función db que creé que determinará la fecha de las partes (gracias @Charles) ...
Puedes llamarlo así ...
Devoluciones...
fuente
Prueba CONVERT en lugar de CAST.
CONVERT permite un tercer parámetro que indica el formato de fecha.
La lista de formatos está aquí: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Actualice después de que se haya seleccionado otra respuesta como la respuesta "correcta":
Realmente no entiendo por qué se selecciona una respuesta que depende claramente de la configuración de NLS en su servidor, sin indicar esta restricción.
fuente
También puedes usar
Funciona en SQL desde ver.2012 y AzureSQL
fuente
Es más seguro y ordenado usar un punto de partida explícito '19000101'
fuente
declare @output datetime2 = 0
y en lugar de@Year - 1900
usar@Year - DATEPART(year,0);
? Esto funciona sin ninguna conversión en SQL Server 2008 y mucho más claro.Si no desea mantener las cadenas fuera de esto, esto también funciona (póngalo en una función):
fuente
Agrego una solución de una línea si necesita una fecha y hora de las partes de fecha y hora :
fuente
Tratar
fuente
Para las versiones de SQL Server inferiores a 12, puedo recomendar el uso
CAST
en combinación conSET DATEFORMAT
cómo crear esas cadenas depende de usted
fuente
Prueba esta consulta:
Resultado:
fuente
Sé que el OP está pidiendo una respuesta de SQL 2005, pero la pregunta es bastante antigua, por lo que si está ejecutando SQL 2012 o superior, puede usar lo siguiente:
Referencia: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
fuente
Personalmente, prefiero Substring, ya que proporciona opciones de limpieza y la capacidad de dividir la cadena según sea necesario. Se supone que los datos tienen el formato 'dd, mm, aaaa'.
Aquí hay una demostración de cómo se puede demandar si los datos se almacenan en una columna. No es necesario decir que es ideal verificar el conjunto de resultados antes de aplicar a la columna.
fuente