Átalakítani az SQL szerver datetime területeken összehasonlítani dátum csak az alkatrészek az indexelt keresések

szavazat
28

Csináltam egy convert(varchar,datefield,112)minden dátum mező, hogy én használ „között” lekérdezések az SQL szerver, hogy én csak a számviteli dátumot, és nem hiányzik egy ideje alapján része datetime területeken.

Most hallok, hogy a megtért nem elfordítható, és hogy vannak jobb módszerek, az SQL Server 2005, összehasonlítani a dátum része datetimes egy lekérdezés annak meghatározására, hogy dátumokat esik tartományban.

Mi az optimális, elfordítható, a módszer, hogy csinál valamit, mint ez:

select * from appointments
where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'
A kérdést 09/12/2008 15:59
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
2

Ez helyes - ezzel az átalakítás lesz végre a konverziót minden sorban lekérdezhető. Még mindig jobb, hogy hagyja el a dátum oszlopok a dátumok, és adja át a hol kikötések időpontokban:

select * from appointments where appointmentdate between 
'08/01/2008' AND '08/16/2008'

Megjegyzés: Nem off időt jelenti éjfélkor (00: 00.000), így tartalmazni fogja az összes alkalommal 1/8, és minden alkalommal 15/08, és minden, ami pontosan 2008/08/16 00:00:00

Válaszolt 09/12/2008 16:06
a forrás felhasználó

szavazat
65

A legjobb módja, hogy a szalag az idő részét datetime mező használatával DATEDIFF és dateadd funkciókat.

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

Ezt veszi advantedge azt a tényt, hogy az SQL Server tárolja nyúlik, mint két egész, az egyik képviselő óta eltelt napok száma nap „0” - (1 jan 1900), és a második, amelyik számát jelenti kullancsok (mindegyik kullancs körülbelül 3,33 ms ) éjféltől (az idő) *.

a fenti képlet egyszerűen csak olvasni az első egész. Nincs átalakítás vagy feldolgozás szükséges, ezért rendkívül gyors.

Ahhoz, hogy a lekérdezéseket használjon indexet ... ezt a képletet a bemeneti szűrés paraméterek első, illetve a „másik” oldal az egyenlőségjel a táblázatok dátum időpont mezőben úgy, hogy a lekérdezés optimalizáló nem kell futtatni a számítás minden datetime mező a táblázatban, hogy melyik sorok megfelelnek a szűrő predikátum. Ez teszi a keresést érv „SARG-képes” (Search argumentum)

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

inkább mint

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

* JEGYZET. Belsőleg, a második egész szám (az idő része) tárolja kullancsok. Egy nap vannak 24 x 60 x 60 x 300 = 25.920.000 kullancsok (serendipitously csak alul a max értéket 32 ​​bites egész szám fér). Azonban nem kell aggódni emiatt, ha számtanilag módosító datetime ... Amikor hozzáadásával vagy kivonásával értékek datetimes tudja kezelni az értéket, a frakció mintha ez pontosan megegyezik a frakcionált része egy nap, mintha az komplett datetime érték volt egy lebegőpontos szám, amely egy egész része képviselő a dátumot és a frakcionált része jelenti az időt). azaz,

`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`
Válaszolt 09/12/2008 16:07
a forrás felhasználó

szavazat
1

Van egy számítani továbbra is vontatottan oszlopban számítsa kifejezést kell. Ha oszlopok kerülnek kiszámításra, és kitartott, akkor is indexelni.

Válaszolt 09/12/2008 16:10
a forrás felhasználó

szavazat
5

Konvertálása numerikus típusok, hogy string értékek (egyfajta boksz) nem a legjobban teljesítő értékesítési módszer, amit keres. A nem igazán találhatóak index-képes, mert az aktuális oszlop típus dátum idő.

Ha keres a legjobb módja lekérdezés dátumát, akkor a példa van, de érdemes figyelembe venni a 3 ms pontossággal különbséget MSSQL. Azt is jelentheti, hogy a rekordok egy nap is megjelenik a másik nap eredményét.

Ez

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'

Kell ez

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<='08-14-2008 23:59:59.996'
Válaszolt 09/12/2008 16:11
a forrás felhasználó

szavazat
0

Ott van még a leírt módon a http://www.stillnetstudios.com/comparing-dates-without-times-in-sql-server/

SELECT CAST(FLOOR(CAST( getdate() AS float )) AS datetime)
Válaszolt 28/09/2011 13:31
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more