Saya punya dua tabel di mana kolom [date]
adalah tipe DATETIME2(0)
.
Saya harus membandingkan dua catatan hanya dengan bagian Tanggal mereka (hari + bulan + tahun), membuang bagian Waktu (jam + menit + detik).
Bagaimana saya bisa melakukan itu?
Saya punya dua tabel di mana kolom [date]
adalah tipe DATETIME2(0)
.
Saya harus membandingkan dua catatan hanya dengan bagian Tanggal mereka (hari + bulan + tahun), membuang bagian Waktu (jam + menit + detik).
Bagaimana saya bisa melakukan itu?
Jawaban:
Kelemahan kecil dalam jawaban Marc adalah bahwa kedua bidang tanggal telah typecast, artinya Anda tidak akan dapat meningkatkan indeks apa pun.
Jadi, jika ada kebutuhan untuk menulis kueri yang dapat mengambil manfaat dari indeks pada bidang tanggal, maka pendekatan berikut (agak berbelit-belit) diperlukan.
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: Cara lain untuk mengekstrak tanggal saja (dalam versi SQL Server yang lebih lama) adalah dengan menggunakan trik bagaimana tanggal diwakili secara internal.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
Meskipun saya membatalkan jawaban yang ditandai sebagai benar. Saya ingin menyentuh beberapa hal untuk siapa pun yang menemukan ini.
Secara umum, jika Anda memfilter khusus pada nilai Date saja. Microsoft merekomendasikan untuk menggunakan format netral bahasa ymd
atau y-m-d
.
Perhatikan bahwa formulir '2007-02-12' dianggap bahasa-netral hanya untuk tipe data DATE, DATETIME2, dan DATETIMEOFFSET.
Untuk melakukan perbandingan tanggal menggunakan pendekatan tersebut sederhana. Pertimbangkan contoh berikut yang dibuat-buat.
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
Di dunia yang sempurna, melakukan manipulasi apa pun pada kolom yang difilter harus dihindari karena ini dapat mencegah SQL Server menggunakan indeks secara efisien. Yang mengatakan, jika data yang Anda simpan hanya peduli dengan tanggal dan bukan waktu, pertimbangkan menyimpan seperti DATETIME
tengah malam sebagai waktu. Karena:
Ketika SQL Server mengubah literal ke tipe kolom yang difilter, ia mengasumsikan tengah malam ketika bagian waktu tidak ditunjukkan. Jika Anda ingin filter seperti itu mengembalikan semua baris dari tanggal yang ditentukan, Anda harus memastikan bahwa Anda menyimpan semua nilai dengan tengah malam sebagai waktunya.
Jadi, anggap Anda hanya peduli dengan tanggal, dan simpan data Anda seperti itu. Kueri di atas dapat disederhanakan menjadi:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate
Anda bisa coba yang ini
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
Saya mengujinya untuk MS SQL 2014 dengan mengikuti kode
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
Untuk Bandingkan dua tanggal seperti MM / DD / YYYY hingga MM / DD / YYYY . Ingat, jenis kolom Bidang pertama harus dateTime. Contoh: columnName : payment_date dataType: DateTime .
setelah itu Anda dapat dengan mudah membandingkannya. Kueri adalah:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
Sangat sederhana ...... Ini mengujinya .....