2009-03-11 13 views
6

Diese Select-Anweisung gibt mir die arithmetische Fehlermeldung Konvertieren von Ausdruck:Arithmetischer Überlauffehler zu Datentyp Datetime

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

Während diese 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 Daten sein (Ich habe nach Null-Werten gesucht, und es gibt keine)?

Antwort

9

Gefunden das Problem zu sein, wenn ein Datum auf 9999-12-31 gesetzt wurde, wahrscheinlich zu groß für die Dezimalstelle zu behandeln. Von dezimal zu float geändert, und alles funktioniert wie ein Zauber.

7

Im Allgemeinen ist das Konvertieren eines Datums in eine Zahl oder eine Zeichenfolge zum Ausführen von Datumsoperationen sehr ineffizient. (Die Konvertierungen sind relativ intensiv, ebenso wie die String-Manipulationen.) Es ist viel besser, sich nur an Datumsfunktionen zu halten.

Das Beispiel Sie geben ist (glaube ich) die Zeit Teil des Datetime abzustreifen, das folgende tut, ohne den Overhead von Umwandlungen ...

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

Dies sollte auch arithmentic Überlauf vermeiden .. .

+3

Der einzige Weg, es zu tun ... – gbn

+0

@ gbn Aber es wird dies nicht tun 'datediff (ms, '1970-01-01', getdate())'. – Saulius

+0

Dank @MatBailie behoben mein Problem! Die Verwendung von CAST gab mir den Fehler "Arithmetischer Überlauffehler beim Konvertieren des Ausdrucks in Datentyp datetime" –

Verwandte Themen