SQL Server: Dapatkan data hanya untuk tahun lalu

98

Saya menulis kueri di mana saya harus mendapatkan datanya hanya untuk tahun lalu. Apa cara terbaik untuk melakukannya?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
Josh Mein
sumber

Jawaban:

196

Berikut ini menambahkan -1 tahun ke tanggal sekarang:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
samjudson
sumber
1
Milik Anda lebih bersih tetapi inilah yang saya miliki: TAHUN (GETDATE ()) - 1
PCPGMR
2
Itu mengembalikan Anda sebuah angka, bukan tanggal, Anda tidak dapat membandingkannya dengan tanggal, tanpa juga menghitung tahun dari tanggal itu. Ini kemudian akan mengembalikan hasil yang salah untuk 31 Des 2014 vs 1 Jan 2015 - yang berada di tahun yang berbeda, tetapi tidak selisih satu tahun ...
samjudson
benar. Saya perlu membandingkan tahun dengan jumlah tahun, jadi 2013 hingga 2014 misalnya karena data yang masuk hanya memiliki tahun. Saya tidak jelas dalam komentar saya. Terima kasih
PCPGMR
Saya mendapat pesan kesalahan menjalankan kueri ini ... "FUNCTION DatabaseName.DATEADD tidak ada" Ada saran?
Marcello Perri
10

Saya menemukan halaman ini saat mencari solusi yang akan membantu saya memilih hasil dari tahun kalender sebelumnya. Sebagian besar hasil yang ditunjukkan di atas tampaknya mengembalikan item dari 365 hari terakhir, yang tidak berfungsi untuk saya.

Pada saat yang sama, itu memberi saya arahan yang cukup untuk menyelesaikan kebutuhan saya dalam kode berikut - yang saya posting di sini untuk orang lain yang memiliki kebutuhan yang sama dengan saya dan yang mungkin menemukan halaman ini untuk mencari solusi.

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))

Terima kasih kepada mereka di atas yang solusinya membantu saya mencapai apa yang saya butuhkan.

DE Putih
sumber
7

Nah, saya pikir ada sesuatu yang hilang di sini. Pengguna ingin mendapatkan data dari tahun lalu dan bukan dari 365 hari terakhir. Ada perbedaan besar. Menurut saya, data tahun lalu adalah setiap data tahun 2007 (kalau saya tahun 2008 sekarang). Jadi jawaban yang benar adalah:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1

Kemudian jika Anda ingin membatasi query ini, Anda dapat menambahkan beberapa filter lain, tetapi selalu mencari di tahun lalu.

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
Ivan Bosnic
sumber
Ini akan memiliki kinerja yang sangat buruk pada tabel besar, kueri Anda akan mengulang setiap catatan untuk mengevaluasi nilai tahun dari tanggal tersebut, akan lebih baik untuk menggunakan rentang tanggal
Adriaan Davel
4

Cari tanggaladd di BOL

dateadd(yy,-1,getdate())
SQLMenace
sumber
4

Yang paling mudah dibaca, IMO:

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

Yang:

  1. Dapatkan tanggal waktu sekarang GETDATE () = # 8/27/2008 10:23 am#
  2. Mengonversi ke string dengan format 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '8/27/2007'
  3. Mengonversi ke tanggal waktu CONVERT (datetime, '8/27/2007') = # 8/27/2008 12:00 AM#
  4. Mengurangi 1 tahun DATEADD (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

Ada varian dengan DATEDIFF dan DATEADD untuk membuat Anda tengah malam hari ini, tetapi mereka cenderung agak tumpul (meskipun sedikit lebih baik pada kinerja - bukan yang Anda perhatikan dibandingkan dengan pembacaan yang diperlukan untuk mengambil data).

Tandai Brackett
sumber
2

GETDATE () mengembalikan tanggal dan waktu saat ini .

Jika tahun lalu dimulai pada tengah malam hari ini tahun lalu (seperti dalam contoh asli) Anda harus menggunakan sesuatu seperti:

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
Grzegorz Gierlik
sumber
0

Saran lainnya bagus jika Anda memiliki "SQL saja".

Namun saya menyarankan, bahwa - jika mungkin - Anda menghitung tanggal dalam program Anda dan memasukkannya sebagai string dalam kueri SQL.

Setidaknya untuk tabel besar (yaitu beberapa juta baris, mungkin digabungkan dengan gabungan) yang akan memberi Anda peningkatan kecepatan yang cukup karena pengoptimal dapat bekerja dengan lebih baik.

BlaM
sumber
2
Akan lebih baik jika Anda membuat string berparameter dan menghindari menempatkan nilai dalam string itu sendiri ...
Adriaan Davel
0

argumen untuk fungsi DATEADD:

DATEADD (*datepart* , *number* , *date* )

datepart dapat berupa: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms

number adalah ekspresi yang dapat diselesaikan ke int yang ditambahkan ke datepart of date

date adalah ekspresi yang bisa diselesaikan menjadi nilai waktu, tanggal, waktu kecil, tanggal waktu, tanggal2, atau waktu offset.

imtheref
sumber
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
Tony
sumber
1
Ini tidak menjawab pertanyaan itu.
Nathan Skerl
Selain itu, loop sementara umumnya buruk untuk SQL
StingyJack
0

Saya, seperti @DE White, datang ke sini karena alasan yang sama tetapi berbeda dari pertanyaan aslinya. Pertanyaan asli menanyakan 365 hari terakhir. Jawaban @ samjudson menyatakan hal itu. Jawaban @DE White mengembalikan hasil untuk tahun kalender sebelumnya.

Kueri saya sedikit berbeda karena berfungsi untuk tahun sebelumnya hingga dan termasuk tanggal saat ini:

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

Misalnya, pada 17 Feb 2017, kueri ini mengembalikan hasil dari 1/1/2016 hingga 2/17/2017

kevinaskevin
sumber
0

Saya memiliki masalah serupa tetapi pembuat kode sebelumnya hanya memberikan tanggal dalam format mm-yyyy. Solusi saya sederhana tetapi mungkin terbukti bermanfaat bagi sebagian orang (saya juga ingin memastikan ruang awal dan akhir dihilangkan):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
Rick Savoy
sumber
0

Untuk beberapa alasan, tidak ada hasil di atas yang berhasil untuk saya.

Ini memilih 365 hari terakhir.

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()
Connor
sumber
akan lebih baik jika Anda dapat menambahkan versi server MSSQL tempat ini berfungsi.
sekarang