2009-10-06 12 views
5

Pracuję nad procedurą czyszczenia SQL Server 2005, która musi usunąć wszystkie wiersze w tabeli starsze niż 1 rok temu + czas minął w bieżącym roku.Jak mogę uzyskać datę pierwszej sekundy roku z SQL?

Ex: Gdybym wykonać procedurę dzisiaj 10.06.2009 musi usuwać wiersze starsze niż 2008-01-01 00:00 (czyli 2007 włączone i do tyłu).

Jak mogę uzyskać datę pierwszej sekundy roku?

Próbowałem to:

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

ale mam 1905-07-02 00:00:00.000 i nie 2008-01-01 00:00 (jak błędnie spodziewać).

Czy ktoś może mi pomóc, proszę?

Odpowiedz

4

to będzie działać:

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

(wiem, że to nie jest "najlepsze" rozwiązanie i prawdopodobnie wymaga więcej rzutów, niż to konieczne, ale działa, a jak to będzie używane, wydaje się być pragnieniem ! Rozwiązaniem matic)

+0

Hmm .. Ciekawe, jak inna odpowiedź na to pytanie (w chwili pisania tego tekstu) ma 8 przegranych, podczas gdy moja ma tylko 1 up i 1 down vote, ale moje jest jedynym rozwiązaniem, które daje poprawną odpowiedź. (Na dzień dzisiejszy (6 października 2009 r.) wynikiem jest 2008-01-01 00:00:00, podczas gdy rozwiązanie Raj powraca 2009-01-01 00:00:00) – CraigTP

+1

Lubię WYBIERZ KONWERTĘ (DATETIME, CAST (ROK (GETDATE()) - 1 AS VARCHAR) + '0101', 112) lub SELECT CONVERT (DATETIME, CAST (ROK (GETDATE()) - 1 AS VARCHAR), 112) więcej, ponieważ określa on format wejściowy. – LukLed

+0

@CraigTP: Ja sam przegłosowałem cię, ponieważ miałeś właściwą odpowiedź. Zmieniłem moje, aby odzwierciedlały korektę –

11

EDYCJA: Powracał bieżący rok, kiedy pytanie dotyczyło roku poprzedniego. Kod został poprawiony, aby to odzwierciedlić.

użycie tego

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

LUB używać zmiennej:

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

jest to dość standardowe rzeczy w SQL Server, które każdy powinien uczyć się, tu jest link, który pokazuje, jak to zrobić za rok, miesiąc, dzień, godzina, minuta ... http: //stackoverflow.com/questions/85373/floor-a-date-in-sql-server –

+0

Ta odpowiedź daje NIEPRAWIDŁOWY wynik. – JamesM

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

SELECT DATEADD (rok, DATEDIFF (rok, 365, GETDATE()), 0) Nie działa z rokiem przestępnym :( –

Powiązane problemy