sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter SQL-serverens datotidsfelter for kun at sammenligne datodele med indekserede opslag

Den bedste måde at fjerne tidsdelen af ​​et datetime-felt på er at bruge funktionerne datediff og dateadd.

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

Dette drager fordel af det faktum, at SQL Server gemmer datoer som to heltal, det ene repræsenterer antallet af dage siden dag "0" - (1. jan 1900), og det andet repræsenterer antallet af flueben (hvert kryds er omkring 3,33 ms) siden midnat (for tiden) *.

formlen ovenfor skal simpelthen kun læse det første heltal. Der kræves ingen konvertering eller behandling, så det er ekstremt hurtigt.

For at få dine forespørgsler til at bruge et indeks... brug først denne formel på inputfiltreringsparametrene eller på den "anden" side af lighedstegnet fra feltet for tabellernes dato og klokkeslæt, så forespørgselsoptimeringsværktøjet ikke skal køre beregningen på hvert datetime-felt i tabellen for at bestemme, hvilke rækker der opfylder filterprædikatet. Dette gør dit søgeargument "SARG-able" (Søgeargument)

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

snarere end

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

* BEMÆRK. Internt gemmer det andet heltal (tidsdelen) flueben. På en dag er der 24 x 60 X 60 X 300 =25.920.000 flueben (serendipitalt lige under den maksimale værdi, et 32 ​​bit heltal kan indeholde). Du behøver dog ikke bekymre dig om dette, når du aritmetisk ændrer et dato-klokkeslæt... Når du tilføjer eller trækker værdier fra datetimes, kan du behandle værdien som en brøk, som om den var nøjagtigt lig med brøkdelen af ​​en dag, som om komplet datetime-værdi var et flydende decimaltal bestående af en heltalsdel, der repræsenterer datoen, og den brøkdel, der repræsenterer klokkeslættet). 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. Hvordan kalder jeg mine C++ binære filer via CGI-grænsefladen?

  2. Hvordan kan jeg ændre en primær nøglebegrænsning ved hjælp af SQL-syntaks?

  3. MYSQL UNION DISTINKT

  4. Mysql-kolonnebegrænsning som ikke tom / påkrævet