sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera SQL-server datetime-fält för att endast jämföra datumdelar, med indexerade sökningar

Det bästa sättet att ta bort tidsdelen av ett datetime-fält är att använda funktionerna datediff och dateadd.

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

Detta drar fördel av det faktum att SQL Server lagrar datum som två heltal, ett representerar antalet dagar sedan dag "0" - (1 jan 1900), och det andra som representerar antalet ticks (varje bock är cirka 3,33 ms) sedan midnatt (för tiden) *.

formeln ovan måste helt enkelt bara läsa det första heltal. Det krävs ingen konvertering eller bearbetning, så det är extremt snabbt.

För att få dina frågor att använda ett index... använd den här formeln på indatafiltreringsparametrarna först, eller på den "andra" sidan av likhetstecknet från fältet för tabellernas datum och tid, så att frågeoptimeraren inte behöver köra beräkningen i varje datetime-fält i tabellen för att avgöra vilka rader som uppfyller filterpredikatet. Detta gör ditt sökargument "SARG-able" (Search ARGument)

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

snarare än

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

* NOTERA. Internt lagrar det andra heltal (tidsdelen) bockar. På en dag finns det 24 x 60 X 60 X 300 =25 920 000 bockar (serendipitalt precis under maxvärdet som ett 32-bitars heltal kan hålla). Du behöver dock inte oroa dig för detta när du aritmetiskt ändrar en datetime... När du lägger till eller subtraherar värden från datetimes kan du behandla värdet som ett bråk som om det var exakt lika med bråkdelen av en dag, som om fullständigt datetime-värde var ett flyttal som bestod av en heltalsdel som representerar datumet och den bråkdel som representerar tiden). dvs

`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. Ladda upp CSV till databasen med php

  2. Gå med i två tabeller baserat på närliggande tidsstämplar

  3. välj rownum från lön där rownum=3;

  4. Ruby gem mysql2 installation misslyckas