2012-02-22 59 views
6

En el MSDN se dice claramente que:"Agregar un valor a una columna 'datetime' causó un desbordamiento."

The date argument cannot be incremented to a value outside the range of its data type. In the following statements, the number value that is added to the date value exceeds the range of the date data type. The following error message is returned: "Adding a value to a 'datetime' column caused overflow."

Y el ejemplo:

SELECT DATEADD(year,2147483647, '2006-07-31'); 
SELECT DATEADD(year,-2147483647, '2006-07-31'); 

que provoca el error:

"Adding a value to a 'datetime' column caused overflow."

Esto parece correcto. Pero ¿por qué me sale el mismo error al ejecutar esta sentencia SQL:

SELECT DATEDIFF(YY,'1013-12-12',DATEADD(YY,-300,getdate())) 

más específica y única:

SELECT DATEADD(YY,-300,getdate()) 
+2

El 'datetime' mínimo es 1753 [porque ese fue el año después de que Gran Bretaña adoptó el Calendario Gregoriano] (http://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1- 1753-in-sql-server/3310588 # 3310588) ¿En qué versión de SQL Server estás? –

+1

@Joro - Bien 'SELECCIONAR DATEADD (YY, -300, elenco (getdate() como datetime2))' funcionará para usted en ese momento. –

+0

@MartinSmith Sí, tienes razón. He comprobado esto y las fechas de soporte del formato 'datetime2' y 'datetimeoffset' desde enero de 1,0001 hasta el 31 de diciembre de 1999. Las sentencias SQL hasta ahora significan que el tipo predeterminado de la función getdate() es 'datetime' y por qué si Se dice que 'datetime' y 'smalldatetime' se deprecian. – gotqn

Respuesta

9

First google result for 'sql datetime range'. 1 de enero de 1753. Ese es tu límite inferior.

Un comentario sobre la pregunta agregada this trivia sobre el origen de este límite inferior.

+0

Agradable. Gracias por la respuesta, pero es un poco triste. Por ejemplo, si alguien almacena información histórica en su base de datos antes de este año, no podrá usar algunas funciones integradas ... – gotqn

1

Si realiza la conversión de DateTime con un campo, use una declaración de caso en la conversión para verificar si el campo es mayor que 1 O 1000000, entonces ya no debería tener este problema.

Cuestiones relacionadas