Jawaban:
Berikut ini menambahkan -1 tahun ke tanggal sekarang:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
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.
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'
Yang paling mudah dibaca, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Yang:
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).
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
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.
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.
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
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
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())