Cara terbaik untuk menghapus bagian waktu dari bidang datetime adalah menggunakan fungsi dateiff dan dateadd.
DateAdd(day, datediff(day,0, MydateValue), 0)
Ini mengambil keuntungan dari fakta bahwa SQL Server menyimpan tanggal sebagai dua bilangan bulat, satu mewakili jumlah hari sejak hari "0" - (1 jan 1900), dan yang kedua mewakili jumlah kutu (setiap centang sekitar 3,33 ms) sejak tengah malam (untuk waktu) *.
rumus di atas hanya perlu membaca bilangan bulat pertama. Tidak ada konversi atau pemrosesan yang diperlukan, jadi ini sangat cepat.
Untuk membuat kueri Anda menggunakan indeks... gunakan rumus ini pada parameter pemfilteran input terlebih dahulu, atau di sisi "lain" dari tanda sama dengan dari bidang tanggal waktu tabel, sehingga pengoptimal kueri tidak harus menjalankan penghitungan pada setiap bidang datetime dalam tabel untuk menentukan baris mana yang memenuhi predikat filter. Ini membuat argumen penelusuran Anda "Mampu SARG" (Argumen Penelusuran)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
daripada
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* CATATAN. Secara internal, bilangan bulat kedua (bagian waktu) menyimpan kutu. Dalam sehari ada 24 x 60 X 60 X 300 =25.920.000 tick (kebetulan tepat di bawah nilai maksimal yang dapat ditampung oleh integer 32 bit). Namun, Anda tidak perlu khawatir tentang hal ini saat memodifikasi datetime secara aritmatika... Saat menambahkan atau mengurangi nilai dari datetimes, Anda dapat memperlakukan nilai sebagai pecahan seolah-olah sama persis dengan bagian pecahan hari, seolah-olah nilai datetime lengkap adalah angka floating point yang terdiri dari bagian bilangan bulat yang mewakili tanggal dan bagian pecahan yang mewakili waktu). yaitu,
`Declare @Dt DateTime Set @Dt = getdate()
Set @Dt = @Dt + 1.0/24 -- Adds one hour
Select @Dt
Set @Dt = @Dt - .25 -- Moves back 6 hours
Select @Dt`