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

Konversi bidang tanggal waktu server SQL untuk membandingkan bagian tanggal saja, dengan pencarian yang diindeks

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`


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa nilai yang disimpan dalam kolom NVARCHAR terkadang diisi dengan spasi tambahan?

  2. Izin EXECUTE ditolak - 'aspnet_Roles_RoleExists'

  3. Menerapkan relasi satu-ke-nol-atau-satu di SQL Server

  4. Cara menentukan apakah bilangan itu float atau integer

  5. Permintaan SQL untuk mengambil data dari dua tabel dengan tidak dalam kondisi