Arithmetischer Überlauferrors, der den Ausdruck in den datatyp datetime umwandelt

Diese select-statement gibt mir die arithmetische Fehlermeldung:

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

Während dies funktioniert:

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

Könnte es etwas falsch mit den data geben (ich habe nach Nullwerten überprüft, und es gibt keine)?

Fand das Problem zu sein, wenn ein date auf 9999-12-31 gesetzt wurde, wahrscheinlich zu groß für die Dezimalzahl zu behandeln. Geändert von Dezimal zu float, und alles funktioniert wie ein Charme.

Im Allgemeinen ist die Umwandlung eines dates in eine numerische oder characterfolge, um date Operationen auf sie durchzuführen, ist sehr ineffizient. (Die Conversions sind relativ intensiv, genauso wie die Stringmanipulationen.) Es ist viel besser, sich an genauere functionen zu halten.

Das Beispiel, das du gibst, ist (ich glaube), um die time Teil der DateTime zu entfernen, das folgende tut das ohne den Overhead von Conversions …

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

Das sollte auch arithmentische Überläufe vermeiden …