Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Konwertuj pola daty i godziny serwera SQL, aby porównywać tylko części dat za pomocą indeksowanych wyszukiwań

Najlepszym sposobem na usunięcie części czasu z pola daty i czasu jest użycie funkcji datediff i dateadd.

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

Wykorzystuje to fakt, że SQL Server przechowuje daty jako dwie liczby całkowite, jedna reprezentująca liczbę dni od dnia „0” - (1 stycznia 1900), a druga reprezentująca liczbę zaznaczeń (każdy tik trwa około 3,33 ms) od północy (na czas)*.

powyższa formuła musi po prostu odczytać tylko pierwszą liczbę całkowitą. Nie wymaga konwersji ani przetwarzania, dzięki czemu jest niezwykle szybki.

Aby zapytania korzystały z indeksu... użyj tej formuły najpierw na wejściowych parametrach filtrowania lub po "drugiej" stronie znaku równości z pola data i godzina tabeli, aby optymalizator zapytań nie musiał uruchamiać obliczeń w każdym polu datetime w tabeli, aby określić, które wiersze spełniają predykat filtru. To sprawia, że ​​argument wyszukiwania jest „zgodny z SARG” (Argument wyszukiwania)

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

zamiast

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

* NOTATKA. Wewnętrznie druga liczba całkowita (część czasu) przechowuje kleszcze. W ciągu dnia jest 24 x 60 x 60 x 300 =25 920 000 tików (nieoczekiwanie tuż poniżej maksymalnej wartości, jaką może pomieścić 32-bitowa liczba całkowita). Jednak nie musisz się tym martwić podczas arytmetycznej modyfikacji daty i godziny... Podczas dodawania lub odejmowania wartości od daty i godziny możesz traktować wartość jako ułamek tak, jakby była dokładnie równa części ułamkowej dnia, tak jakby pełna wartość datetime była liczbą zmiennoprzecinkową składającą się z części całkowitej reprezentującej datę i części ułamkowej reprezentującej godzinę). czyli

`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. Procedura składowana jest powolna w Entity Framework

  2. Nie można zalogować się do SQL Server 2008 za pomocą narzędzia wiersza poleceń

  3. jak pula połączeń z bazą danych wpływa na wydajność?

  4. Problem z uprawnieniami w programie SSMS:Odmówiono uprawnienia SELECT do obiektu „extended_properties”, bazy danych „mssqlsystem_resource”, ... Błąd 229)

  5. Win32Exception (0x80004005):Przekroczono limit czasu operacji oczekiwania