2009-03-11 22 views
6

Esta instrucción de selección me da el mensaje de error aritmético:error de desbordamiento aritmético al convertir expresión a tipo de datos de fecha y hora

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table 
WHERE LeftDate > '2008-12-31' 

Si bien éste funciona:

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table 
WHERE LeftDate < '2008-12-31' 

¿Puede haber algo mal con los datos (He verificado valores nulos, y no hay ninguno)?

Respuesta

9

encontrado el problema a ser cuando se fijó una fecha de 9999-12-31, probablemente demasiado grande para el decimal a manejar. Cambiado de decimal a flotante, y todo funciona como un amuleto.

7

En general, la conversión de una fecha a una cadena o numérico, para llevar a cabo operaciones de fecha en ella, es altamente ineficiente. (Las conversiones son relativamente intensas, al igual que las manipulaciones de cadenas). Es mucho mejor limitarse a las funciones de fecha.

El ejemplo que dan es (creo) para despojar la pieza del tiempo del DateTime, el siguiente hace que sin la sobrecarga de conversiones ...

DATEADD(DAY, DATEDIFF(DAY, 0, <mydate>), 0) 

Esto también se debe evitar desbordamientos arithmentic .. .

+3

La única manera de hacerlo ... – gbn

+0

@gbn Pero no va a hacer esto 'datediff (ms, '1970-01-01', getdate())'. – Saulius

+0

Gracias @MatBailie esto solucionó mi problema! El uso de CAST me estaba dando un error de "error de desbordamiento aritmético al convertir la expresión a tipo de datos datetime" –

Cuestiones relacionadas