Ini terus sering mengumpulkan suara tambahan, bahkan beberapa tahun kemudian, jadi saya perlu memperbaruinya untuk versi modern Sql Server. Untuk Sql Server 2008 dan yang lebih baru, sangat sederhana:
cast(getDate() As Date)
Perhatikan bahwa tiga paragraf terakhir di dekat bagian bawah masih berlaku, dan Anda sering harus mengambil langkah mundur dan menemukan cara untuk menghindari para pemain di tempat pertama.
Tetapi ada cara lain untuk mencapai ini juga. Inilah yang paling umum.
Cara yang benar (baru sejak Sql Server 2008):
cast(getdate() As Date)
Cara yang benar (lama):
dateadd(dd, datediff(dd,0, getDate()), 0)
Ini sudah lebih tua sekarang, tetapi masih perlu diketahui karena ia juga dapat dengan mudah beradaptasi untuk titik waktu lainnya, seperti momen pertama bulan, menit, jam, atau tahun.
Cara yang benar ini menggunakan fungsi-fungsi yang didokumentasikan yang merupakan bagian dari standar ansi dan dijamin berfungsi, tetapi bisa jadi agak lambat. Ia bekerja dengan menemukan berapa hari ada dari hari 0 hingga hari ini, dan menambahkan bahwa banyak hari kembali ke hari 0. Ini akan bekerja tidak peduli berapa lama penyimpanan data Anda dan tidak peduli apa lokal Anda.
Cara cepat:
cast(floor(cast(getdate() as float)) as datetime)
Ini berfungsi karena kolom datetime disimpan sebagai nilai biner 8-byte. Buang mereka untuk mengapung, lantai mereka untuk menghapus fraksi, dan bagian waktu dari nilai-nilai hilang ketika Anda melemparkannya kembali ke datetime. Itu semua hanya sedikit bergeser tanpa logika yang rumit dan sangat cepat.
Ketahuilah bahwa ini bergantung pada detail implementasi yang dapat diubah oleh Microsoft kapan saja, bahkan dalam pembaruan layanan otomatis. Ini juga tidak terlalu portabel. Dalam praktiknya, sangat tidak mungkin implementasi ini akan berubah dalam waktu dekat, tetapi penting untuk mewaspadai bahaya jika Anda memilih untuk menggunakannya. Dan sekarang kita memiliki opsi untuk berperan sebagai kencan, jarang diperlukan.
Jalan yang salah:
cast(convert(char(11), getdate(), 113) as datetime)
Cara yang salah berfungsi dengan mengonversi string, memotong string, dan mengonversi kembali ke datetime. Itu salah , karena dua alasan: 1) mungkin tidak bekerja di semua lokal dan 2) ini tentang cara paling lambat untuk melakukan ini ... dan bukan hanya sedikit; itu seperti urutan besarnya atau dua lebih lambat dari opsi lain.
Pembaruan Ini telah mendapatkan beberapa suara akhir-akhir ini, jadi saya ingin menambahkan bahwa sejak saya memposting ini saya telah melihat beberapa bukti yang cukup kuat bahwa Sql Server akan mengoptimalkan perbedaan kinerja antara cara "benar" dan cara "cepat" , berarti Anda sekarang harus mendukung yang pertama.
Dalam kedua kasus tersebut, Anda ingin menulis kueri Anda untuk menghindari keharusan melakukan ini sejak awal . Sangat jarang Anda harus melakukan ini pada database.
Di sebagian besar tempat, basis data sudah menjadi hambatan Anda. Biasanya server yang paling mahal untuk menambahkan perangkat keras untuk peningkatan kinerja dan yang paling sulit untuk mendapatkan penambahan itu dengan benar (misalnya, Anda harus menyeimbangkan disk dengan memori). Ini juga yang paling sulit untuk diukur keluar, baik secara teknis maupun dari sudut pandang bisnis; jauh lebih mudah secara teknis untuk menambahkan server web atau aplikasi daripada server database dan bahkan jika itu salah Anda tidak membayar $ 20.000 + per lisensi server untuk IIS atau apache.
Poin yang saya coba sampaikan adalah bahwa sedapat mungkin Anda harus melakukan pekerjaan ini di tingkat aplikasi. Satu- satunya waktu Anda harus menemukan diri Anda memotong datetime pada Sql Server adalah ketika Anda perlu mengelompokkan hari, dan bahkan kemudian Anda mungkin harus memiliki kolom tambahan yang diatur sebagai kolom yang dihitung, dikelola pada waktu memasukkan / perbarui, atau dikelola dalam logika aplikasi. Dapatkan pemecahan indeks, cpu-heavy ini dari basis data Anda.