2009-10-06 13 views
5

Ich arbeite an einer Bereinigungsprozedur auf SQL Server 2005, die alle Zeilen in einer Tabelle älter als 1 Jahr + Zeit im aktuellen Jahr gelöscht werden muss.Wie bekomme ich das Datum der ersten Sekunde des Jahres mit SQL?

Ex: Wenn ich das Verfahren heute ausführen 2009.06.10 es hat Zeilen als älter löschen 2008-01-01 00.00 (dh 2007 aufgenommen und rückwärts).

Wie bekomme ich das Datum der ersten Sekunde des Jahres?

Ich habe dies versucht:

select cast((DATEPART(year, getdate()) -1)AS DATETIME);

aber ich bekomme 1905-07-02 00:00:00.000 und nicht 2008-01-01 00:00 (wie ich falsch erwartet).

Kann mir bitte jemand helfen?

Antwort

4

Dies funktioniert:

select cast('01 jan' + CAST((DATEPART(year, getdate())-1) as varchar) AS DATETIME); 

(ich weiß, es ist nicht die "beste" Lösung und wahrscheinlich umfasst mehr Casts als notwendig, aber es funktioniert, und für wie es verwendet wird, scheint es ein Prag zu sein ! Matic Lösung)

+0

Hmm .. Interessant, wie die andere Antwort auf diese Frage (zum Zeitpunkt des Schreibens) 8 Upvotes hat, während meine nur 1 Up- und 1 Down-Stimme hat, aber meine ist die einzige Lösung, die die richtige Antwort gibt. (dh. Für das heutige Datum (6. Oktober 2009) ist das Ergebnis 2008-01-01 00:00:00, während Rajs Lösung zurückgibt 2009-01-01 00:00:00) – CraigTP

+1

Ich mag SELECT CONVERT (DATETIME, CAST (YEAR (GETDATE()) - 1 AS VARCHAR) + '0101', 112) oder SELECT CONVERT (DATETIME, CAST (JA (GETDATE()) - 1 AS VARCHAR), 112) mehr, weil es Eingabeformat angibt. – LukLed

+0

@CraigTP: Ich habe Sie selbst aufgestuft, weil Sie die richtige Antwort hatten. Ich habe meine geändert, um die Korrektur zu reflektieren –

11

EDIT: Dies war das aktuelle Jahr zurück, wenn die Frage für das Vorjahr war. Der Code wurde korrigiert, um dies zu berücksichtigen.

Verwendung dieses

select DATEADD(yy, DATEADD(yy, DATEDIFF(yy,0,getdate()), 0), -1) 

ODER Ihre Variable zu verwenden:

select DATEADD(yy, DATEADD(yy, DATEDIFF(yy,0,@YourDateTimeValue), 0), -1) 
+5

dies ist ein ziemlich Standard, was in SQL Server, die alle hier lernen sollen, ist ein Link, der zeigt, wie es für Jahr zu tun, Monat, Tag, Stunde, Minute ... http: //stackoverflow.com/questions/85373/floor-a-date-in-sql-server –

+0

Diese Antwort erzeugt das FALSCHE Ergebnis. – JamesM

0
SELECT DATEADD(year, DATEDIFF(year, 365, GETDATE()), 0) 
+1

SELECT DATEADD (Jahr, DATEDIFF (Jahr, 365, GETDATE()), 0) Nicht mit Schaltjahr arbeiten :( –

Verwandte Themen