Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa memotong datetime di SQL Server?

Ini terus sering mengumpulkan suara tambahan, bahkan beberapa tahun kemudian, jadi saya perlu memperbaruinya untuk versi Sql Server modern. Untuk Sql Server 2008 dan yang lebih baru, caranya sederhana:

cast(getDate() As Date)

Perhatikan bahwa tiga paragraf terakhir di dekat bagian bawah masih berlaku, dan Anda sering kali harus mundur selangkah dan mencari cara untuk menghindari pemeran di tempat pertama.

Tetapi ada cara lain untuk mencapai ini juga. Berikut adalah 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 lebih tua sekarang, tetapi masih perlu diketahui karena juga dapat dengan mudah beradaptasi untuk titik waktu lain, seperti momen pertama bulan, menit, jam, atau tahun.

Cara yang benar ini menggunakan fungsi terdokumentasi yang merupakan bagian dari standar ansi dan dijamin berfungsi, tetapi bisa lebih lambat. Ini bekerja dengan mencari berapa hari yang ada dari hari 0 hingga hari ini, dan menambahkan hari itu kembali ke hari 0. Ini akan bekerja tidak peduli bagaimana datetime Anda disimpan 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. Keluarkan mereka untuk mengapung, turunkan untuk menghapus pecahan, dan bagian waktu dari nilai hilang saat Anda melemparkannya kembali ke datetime. Semuanya hanya sedikit bergeser tanpa logika yang rumit dan sangat cepat.

Ketahuilah bahwa ini bergantung pada detail implementasi yang Microsoft bebas ubah kapan saja, bahkan dalam pembaruan layanan otomatis. Ini juga tidak terlalu portabel. Dalam praktiknya, sangat kecil kemungkinan penerapan ini akan berubah dalam waktu dekat, tetapi tetap penting untuk menyadari bahayanya jika Anda memilih untuk menggunakannya. Dan sekarang kami memiliki opsi untuk mentransmisikan sebagai kencan, itu jarang diperlukan.

Cara yang salah:

cast(convert(char(11), getdate(), 113) as datetime)

Cara yang salah bekerja dengan mengonversi ke string, memotong string, dan mengonversi kembali ke datetime. Itu salah , karena dua alasan:1) mungkin tidak berfungsi 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 pilihan lainnya.

Perbarui 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", artinya 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 melakukan pekerjaan ini di database.

Di sebagian besar tempat, database sudah menjadi hambatan Anda. Biasanya server yang paling mahal untuk menambahkan perangkat keras untuk peningkatan kinerja dan yang paling sulit untuk mendapatkan tambahan yang benar (Anda harus menyeimbangkan disk dengan memori, misalnya). Ini juga yang paling sulit untuk dikembangkan, baik secara teknis maupun dari sudut pandang bisnis; jauh lebih mudah secara teknis untuk menambahkan web atau server 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 bila memungkinkan Anda harus melakukan pekerjaan ini di tingkat aplikasi. hanya waktu Anda harus menemukan diri Anda memotong datetime di Sql Server adalah ketika Anda perlu mengelompokkan berdasarkan hari, dan bahkan Anda mungkin harus menyiapkan kolom tambahan sebagai kolom yang dihitung, dipertahankan pada waktu penyisipan/pembaruan, atau dipertahankan dalam aplikasi logika. Dapatkan pemecah indeks, pekerjaan berat cpu ini dari database Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menampilkan Kolasi Database di SQL Server (T-SQL)

  2. Apakah mungkin menggunakan Pencarian Teks Lengkap (FTS) dengan LINQ?

  3. Apakah mungkin untuk memilih data server sql menggunakan posisi ordinal kolom

  4. Contoh Konversi 'tanggal' ke 'datetimeoffset' di SQL Server (T-SQL)

  5. Dapatkan Nilai Batas untuk Tabel yang Dipartisi di SQL Server (T-SQL)