Yalnızca geçen yıla ait verileri almam gereken bir sorgu yazıyorum. Bunu yapmanın en iyi yolu nedir?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
Yanıtlar:
Aşağıdakiler, geçerli tarihe -1 yıl ekler:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
Bu sayfayı, önceki bir takvim yılına ait sonuçları seçmeme yardımcı olacak bir çözüm ararken buldum. Yukarıda gösterilen sonuçların çoğu, benim için çalışmayan son 365 güne ait ürünleri iade ediyor gibi görünüyor.
Aynı zamanda, ihtiyaçlarımı aşağıdaki kodda çözmem için bana yeterince yön verdi - benimle aynı ihtiyacı olan ve bir çözüm ararken bu sayfaya rastlayabilecek diğer herkes için buraya gönderiyorum.
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
Yukarıdaki çözümleri ihtiyacım olan şeye ulaşmama yardımcı olanlara teşekkürler.
Sanırım burada bir şey eksik. Kullanıcı, son 365 güne ait değil, geçen yıla ait verileri almak istiyor. Çok büyük bir fark var. Kanımca, geçen yılın verileri 2007'deki tüm verilerdir (eğer şimdi 2008'deysem). Dolayısıyla doğru cevap şu olacaktır:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
Ardından, bu sorguyu kısıtlamak istiyorsanız, başka bir filtre ekleyebilirsiniz, ancak her zaman geçen yıl içinde arama yapabilirsiniz.
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
En okunaklı, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Hangi:
DATEDIFF ve DATEADD ile bugünün gece yarısını gösteren varyantlar var, ancak bunlar oldukça geniş olma eğilimindedir (performansta biraz daha iyi olsa da - verileri almak için gereken okumalara kıyasla fark etmeyeceksiniz).
GETDATE()
geçerli tarih ve saati döndürür .
Eğer geçen yıl (orijinal örnekte olduğu gibi) geçerli gün geçen yılın gece yarısı başlayan gibi bir şey kullanmalısınız:
DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start
Diğer öneriler, "yalnızca SQL" e sahipseniz iyidir.
Bununla birlikte, eğer mümkünse - programınızdaki tarihi hesaplamanızı ve SQL sorgusuna dize olarak eklemenizi öneririm .
En azından büyük tablolar için (yani birkaç milyon satır, belki birleşimlerle birleştirilir), bu size önemli bir hız artışı sağlayacak çünkü optimize edici çok daha iyi çalışabilir.
DATEADD işlevi için bağımsız değişken:
DATEADD (*datepart* , *number* , *date* )
veri bölümü şöyle olabilir: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
sayı , tarihin tarih bölümüne eklenen bir int'e çözümlenebilen bir ifadedir
tarih , bir saat, tarih, küçük tarih / saat, tarih saat, tarih saat2 veya tarih saat kaçıklık değerine çözümlenebilen bir ifadedir.
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
select @sYear + @sMonth
set @iMonth = @iMonth - 1
end
@DE White gibi ben de buraya orijinal sorudan benzer ama farklı nedenlerle geldim. Asıl soru son 365 günü soruyor. @ samjudson'ın cevabı bunu sağlıyor. @DE White'ın cevabı, önceki takvim yılına ait sonuçları döndürür.
Sorgum, önceki yıl için geçerli tarihe kadar ve bu tarih dahil olmak üzere çalıştığı için biraz farklı :
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Örneğin, 17 Şubat 2017'de bu sorgu 1/1/2016 ile 2/17/2017 arasındaki sonuçları döndürür.
Benzer bir sorun yaşadım, ancak önceki kodlayıcı tarihi yalnızca aa-yyyy biçiminde sağladı. Çözümüm basit ama bazıları için faydalı olabilir (ayrıca başlangıç ve bitiş boşluklarının kaldırıldığından emin olmak istedim):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())