SQL-Filter aus bestimmten Monat, Tag und time für jedes Jahr

Microsoft Dynamics NAV verwendet die datetime von yyyy-12-31 23:59:59.000 , um jährliche Abschlusseinträge zu identifizieren. Ich versuche, einen Bericht zu schreiben, der alle meine Einsendungen mitbringen wird. Die Abfrage funktioniert gut für 2014 wenn ich explizit eine WHERE Klausel von verwenden

 WHERE [Posting Date] <> '2014-12-31 23:59:59.000') 

Aber ich brauche die Abfrage für jedes Jahr zu arbeiten. Ich habe es versucht:

 WHERE (DATEPART(mm, [Posting Date]) <> 12) AND (DATEPART(dd, [Posting Date]) <> 31) AND (DATEPART(hh, [Posting Date]) <> 23) AND (DATEPART(mi, [Posting Date]) <> 59) AND (DATEPART(ss, [Posting Date]) <> 59) 

Aber das gefiltert alles, was im December oder hatte einen Tag von 31 oder eine Stunde von 23 , etc …

Gibt es einen einfachen path, um eine bestimmte datetime zu filtern, aber mit jedem Jahr?

Vielleicht das:

 WHERE MONTH([Posting Date]) <> 12 OR DAY([Posting Date]) <> 31 OR CAST([Posting Date] AS TIME) <> CAST('23:59:59.000' AS TIME) 

Noch mehr kurze Antwort:

 WHERE YEAR([Posting Date]) <> YEAR(DATEADD(ss, 1, [Posting Date])) 

Eine andere Sache, die Sie auch tun können, ist so etwas wie das, was eine leichte Abweichung von dem ist, was Sie versucht haben.

 WHERE 1 = CASE WHEN ( DATEPART(MONTH, [POSTING DATE]) = 12 AND DATEPART(DAY, [POSTING DATE]) = 31 AND DATEPART(HOUR, [POSTING DATE]) = 23 AND DATEPART(MINUTE, [POSTING DATE]) = 59 AND DATEPART(SECOND, [POSTING DATE]) = 59 ) THEN 0 ELSE 1 END 

In diesem Szenario benutze ich einfach einen CASE , um diese Zeilen zu identifizieren, die das date der letzten Sekunde des Jahres haben und die Auswertung von 1/0 den Rest und filtert die unerwünschten datasätze aus.