Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразувайте полета за дата и час на SQL сървър, за да сравнявате само части от дата, с индексирани справки

Най-добрият начин да премахнете времевата част от полето за дата и час е да използвате функциите datediff и dateadd.

   DateAdd(day, datediff(day,0, MydateValue), 0)

Това се възползва от факта, че SQL Server съхранява датите като две цели числа, едното представлява броя на дните от деня "0" - (1 януари 1900 г.), а второто представлява броя на отметките (всеки тик е около 3,33 ms) от полунощ (за времето) *.

формулата по-горе просто трябва да прочете само първото цяло число. Не е необходимо преобразуване или обработка, така че е изключително бързо.

За да накарате вашите заявки да използват индекс... използвайте тази формула първо върху входните филтриращи параметри или от "другата" страна на знака за равенство от полето за дата и час на таблиците, така че оптимизаторът на заявките да не трябва да изпълнява изчислението на всяко поле за дата и час в таблицата, за да определи кои редове отговарят на предиката за филтър. Това прави вашия аргумент за търсене „SARG-способен“ (Search ARGument)

Where MyDateTimeColumn > DateAdd(day, 
      datediff(day,0, @MydateParameter), 0)    -- SARG-able

вместо

Where DateAdd(day, datediff(day,0, 
      MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able

* ЗАБЕЛЕЖКА. Вътрешно, второто цяло число (времевата част) съхранява отметки. В един ден има 24 x 60 X 60 X 300 =25 920 000 тика (по случайност точно под максималната стойност, която може да съдържа 32-битово цяло число). Не е нужно обаче да се притеснявате за това, когато аритметично променяте дата и час... Когато добавяте или изваждате стойности от дати и часове, можете да третирате стойността като дроб, сякаш е точно равна на дробната част от деня, сякаш пълната стойност за дата и час беше число с плаваща запетая, състоящо се от цяла част, представляваща датата, и дробна част, представляваща часа). т.е.

`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. Изберете, модифицирайте и вмъкнете в същата таблица

  2. Как да създадете пряк път за SSMS и да се свържете автоматично със SQL сървър по подразбиране - SQ:Server / TSQL Урок, част 4

  3. Необходимо ли е да се използва # за създаване на временни таблици в SQL сървър?

  4. 7645 Нулев или празен предикат на пълен текст

  5. Сигнали за агент на SQL Server