SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Kueri di atas memberikan nilai waktu-tanggal untuk tengah malam pada awal 31 Desember. Ini kurang lebih 24 jam dari momen terakhir tahun ini. Jika Anda ingin memasukkan waktu yang mungkin terjadi pada tanggal 31 Desember, maka Anda harus membandingkan dengan tanggal pertama tahun berikutnya, dengan <
perbandingan. Atau Anda dapat membandingkan dengan beberapa milidetik terakhir tahun ini, tetapi ini masih menyisakan celah jika Anda menggunakan sesuatu selain DATETIME (seperti DATETIME2):
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear
Periode Lainnya
Pendekatan ini memiliki dua aspek yang bagus:kinerja yang baik dan dapat dengan mudah diubah untuk periode lain dengan mengganti kedua kemunculan yy
(=tahun) dengan string yang berbeda:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Hati-hati dengan minggu:hari mulai tergantung pada pengaturan server.)
Detail Teknologi
Ini bekerja dengan mencari tahu jumlah tahun sejak 1900 dengan DATEDIFF(yy, 0, GETDATE())
dan kemudian menambahkannya ke tanggal nol =1 Jan 1900. Ini dapat diubah agar berfungsi untuk tanggal arbitrer dengan mengganti GETDATE()
bagian atau tahun sewenang-wenang dengan mengganti DATEDIFF(...)
fungsi dengan "Tahun - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015