sql >> Database >  >> RDS >> Sqlserver

Converteer SQL-server datetime-velden om alleen datumdelen te vergelijken, met geïndexeerde zoekopdrachten

De beste manier om het tijdgedeelte van een datetime-veld te verwijderen, is door de functies datediff en dateadd te gebruiken.

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

Dit maakt gebruik van het feit dat SQL Server datums opslaat als twee gehele getallen, waarbij één het aantal dagen sinds dag "0" - (1 jan 1900) vertegenwoordigt en de tweede het aantal ticks (elke tick is ongeveer 3,33 ms) sinds middernacht (voor die tijd) *.

de bovenstaande formule hoeft alleen maar het eerste gehele getal te lezen. Er is geen conversie of verwerking vereist, dus het is extreem snel.

Om uw query's een index te laten gebruiken... gebruikt u eerst deze formule op de invoerfilterparameters, of aan de "andere" kant van het gelijkteken van het datum-tijdveld van de tabellen, zodat de query-optimizer de berekening niet hoeft uit te voeren op elk datetime-veld in de tabel om te bepalen welke rijen voldoen aan het filterpredikaat. Dit maakt uw zoekargument "SARG-able" (Search ARgument)

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

in plaats van

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

* OPMERKING. Intern slaat het tweede gehele getal (het tijdsdeel) ticks op. In een dag zijn er 24 x 60 X 60 X 300 =25.920.000 teken (toevallig net onder de maximale waarde die een 32-bits geheel getal kan bevatten). U hoeft zich hier echter geen zorgen over te maken bij het rekenkundig wijzigen van een datetime... Bij het optellen of aftrekken van waarden van datetimes kunt u de waarde als een breuk behandelen alsof deze exact gelijk is aan het fractionele deel van een dag, alsof de volledige datetime-waarde was een getal met drijvende komma dat bestond uit een geheel getal dat de datum vertegenwoordigt en het fractionele deel dat de tijd vertegenwoordigt). d.w.z.

`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. Hoe een specifieke waarde te verwijderen uit een door komma's gescheiden tekenreeks in orakel

  2. Hoe pg_sleep() werkt in PostgreSQL

  3. Tekenreeksaaneenschakelingsoperator in Oracle, Postgres en SQL Server

  4. Groeperen op datum, rij terug, zelfs als er geen records zijn gevonden