SQL Server: Yalnızca geçen yıla ait verileri alın


99

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:


196

Aşağıdakiler, geçerli tarihe -1 yıl ekler:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

1
Sizinki daha temiz ama işte sahip olduğum şey: YIL (GETDATE ()) - 1
PCPGMR

2
Bu size bir tarih değil bir sayı verir, o tarihin yılını da hesaplamadan bunu bir tarihle karşılaştıramazsınız. Bu daha sonra 31 Aralık 2014 - 1 Ocak 2015 için - farklı yıllarda, ancak bir yıl arayla olmayan - yanlış sonuçlar
verecektir

doğru. Yılları yıl sayısına göre karşılaştırmam gerekiyordu, bu nedenle 2013'ten 2014'e, örneğin gelen verilerin yalnızca yıl olduğu gibi. Yorumumda net değildim. Teşekkürler
PCPGMR

Bu sorguyu çalıştırırken bir hata mesajı aldım ... "FUNCTION DatabaseName.DATEADD mevcut değil" Herhangi bir öneri var mı?
Marcello Perri

10

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.


7

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'

Bu, büyük tablolarda çok kötü performansa sahip olacak, sorgunuz tarihin yıl değerini değerlendirmek için her kayıt üzerinde döngü oluşturacak, bir tarih aralığı kullanmak daha iyi olacaktır
Adriaan Davel


4

En okunaklı, IMO:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

Hangi:

  1. Şu anki tarih saatini alır GETDATE () = # 8/27/2008 10:23 am#
  2. 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '8/27/2007' biçimindeki bir dizeye dönüştürür
  3. Bir tarihsaat DÖNÜŞTÜRME (tarih saat, '8/27/2007') = # 8/27/2008 12:00 AM#
  4. 1 yıllık DATEADD (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM# çıkarır

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).


2

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

0

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.


2
Parametreli bir dizge oluşturup değeri dizenin kendisine yerleştirmekten kaçınmanız daha iyi olur ...
Adriaan Davel

0

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.


0
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

1
Bu soruyu ele almıyor.
Nathan Skerl

Ayrıca, döngüler genellikle SQL için kötü olsa da
StingyJack

0

@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.


0

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())

0

Bazı nedenlerden dolayı yukarıdaki sonuçların hiçbiri benim için işe yaramadı.

Bu, son 365 günü seçer.

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

bunun çalıştığı MSSQL sunucusunun sürümünü ekleyebilirseniz iyi olur.
itwasntme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.