2009-03-11 16 views
6

Questo select mi dà il messaggio di errore aritmetico:Errore di overflow aritmetico conversione espressione tipo di dati datetime

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

Mentre questo funziona:

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

Ci potrebbe essere qualcosa di sbagliato con i dati (Ho controllato i valori nulli e non ce ne sono)?

risposta

9

Trovato il problema quando una data è stata impostata su 9999-12-31, probabilmente su grande per il decimale da gestire. Cambiato da decimale a fluttuare, e ogni cosa funziona come un incantesimo.

7

In generale, la conversione di una data in un valore numerico o stringa, per eseguire operazioni sulla data su di esso, è altamente inefficiente. (Le conversioni sono relativamente intense, così come le manipolazioni delle stringhe.) È molto meglio attenersi solo alle funzioni di data.

L'esempio che dai è (credo) a spogliare la parte di tempo del DateTime, il seguente fa che senza il sovraccarico di conversioni ...

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

Questo dovrebbe anche evitare gli overflow arithmentic ..

+3

L'unico modo per farlo ... – gbn

+0

@gbn Ma non lo farà 'datediff (ms, '1970-01-01', getdate())'. – Saulius

+0

Grazie @MatBailie questo ha risolto il mio problema! L'utilizzo di CAST mi ha dato l'errore "Errore di conversione aritmetica nell'espressione tipo di dati" –

Problemi correlati