operaciones mayor fechas entre dias convert con comparar calcular sql sql-server

mayor - encontrar la fecha máxima posible en ms sql server 2005+



operaciones con fechas sql (7)

1 de enero de 1753, hasta el 31 de diciembre de 9999

¿Hay alguna función como GETDATE() en Sql Server 2005 que te permita obtener la fecha máxima posible?

No quiero encontrar la fecha más alta en una tabla. Quiero obtener la fecha máxima posible que el servidor sql podrá almacenar.

Básicamente, quiero una fecha de vencimiento de nunca



En mi SQL Server 2008 r2, obtengo estos resultados extraños (no es que vaya a perder esos 3 milésegundos)

SELECT cast(''12/31/9999 23:59:59.997'' as datetime) --RETURNS ''9999-12-31 23:59:59.997'' SELECT cast(''12/31/9999 23:59:59.998'' as datetime) --RETURNS ''9999-12-31 23:59:59.997'' SELECT cast(''12/31/9999 23:59:59.999'' as datetime) --RETURNS The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.


Si realmente desea una fecha de caducidad de "nunca", podría ser mejor almacenar NULL en lugar de una fecha arbitraria de futuro lejano. Si bien es poco probable que la fecha llegue al año 9999 sin que el código sea "reparado", es un valor ilógico almacenar EndDate = never.


La documentación dice que el rango es desde el 1 de enero de 1753 hasta el 31 de diciembre de 1999.

No creo que haya una función integrada, pero podría crear una que devuelva el valor máximo de fecha y hora.

CREATE FUNCTION fn_max_date RETURNS datetime AS return cast(''12/31/9999 23:59:59.9999'' as datetime)


Estoy creando una nueva respuesta a esta pregunta solo para abordar un par de cuestiones menores con la respuesta aceptada de otra manera por scottm.

  1. De acuerdo con los documentos, el valor máximo del componente de tiempo de una datetime y datetime es realmente "23:59:59 .997", por lo que usar un valor de "23: 59: 59.999" realmente se redondeará hasta la medianoche del día siguiente. Donde la parte de fecha ya está dada como 31 de diciembre de 1999, esto intentará redondear al 1 de enero de 10000, lo que da un error fuera de rango.

https://msdn.microsoft.com/en-us/library/ms187819(v=sql.105).aspx dice:

Rango de fechas: 1 de enero de 1753, hasta el 31 de diciembre de 9999

Rango de tiempo: 00:00:00 a 23: 59: 59.997

  1. Los literales de fecha utilizados están en formato de EE. UU., Y aunque estos no son ambiguos para el 31 de diciembre, es mejor utilizar el formato ISO. Nitpicky tal vez, pero creo que leer las fechas en formato mm / dd / aaaa no es muy intuitivo, y sospecho que no estoy solo.

  2. SQL necesita que el cuerpo de la función esté contenido en un bloque BEGIN / END, por lo que, como está escrito, no se pudo crear el ejemplo.

Entonces mi versión mejorada de la función máxima DateTime es:

CREATE FUNCTION fnMaxDateTime() RETURNS DateTime AS BEGIN RETURN CAST(''9999-12-31 23:59:59.997'' AS DateTime) END


CAST parece depender del idioma / cultura de SQL Server.

En mis Servidores SQL 2008 2008 R2 y 2012 ( @@language = ''Deutsch'' ), el siguiente elenco arroja un error:

CAST(''12/31/9999 23:59:59.997'' AS DATETIME)

La conversión de un tipo de datos varchar a un tipo de datos de fecha y hora dio como resultado un valor fuera de rango.

Mientras que este funciona bien:

CAST(''31.12.9999 23:59:59.997'' AS DATETIME)

Creo que el enfoque más seguro es especificar el formato con CONVERT:

/* ISO 8601 */ CONVERT(DATETIME, ''9999-12-31T23:59:59.997'', 126)