Delphi - Dátumkezelés a Transact SQL-ben

Transact SQL 3. rész

forráskód letöltése
Soron következő cikkünkben a dátumok és időpontok kezelésével kapcsolatos tudnivalókat sajátíthatjuk el a Transact SQL nyelvben. 01.sql: GetDate
Az aktuális dátumot és időpontot a GetDate függvény szolgáltatja számunkra.
Visszatérési érték: datetime
SELECT GETDATE() as 'Aktuális dátum és ido'

02.sql: DatePart
Egy dátum és időpontból sok esetben annak csak egy részére vagyunk kíváncsiak, mint például, hogy milyen évet írunk, vagy hány óra van éppen. A dátum és idő többi információja ilyenkor mellékes. A lehetőség adott, hogy egy datetime típusú adatot részeire bontsunk a DatePart függvény segítségével. Ez két paramétert vár: az elsőben meg kell adnunk, hogy mire vagyunk kíváncsiak (év, hónap, stb.), a második paraméterben pedig egy datetime típusú értéket, melyből a szükséges adatot elő kell állítani. Az első paraméter lehetséges értékeit az alábbi táblázat mutatja. Ugyanannak az értéknek a kinyeréséhez több lehetőségünk is van. Például a perc meghatározásához használhatjuk a minute, a mi és az n szövegeket.
  • year, yy, yyyy - év
  • month, mm, m - hónap
  • day, dd, d - nap
  • hour, hh - óra
  • minute, mi, n - perc
  • second, ss, s - másodperc
  • millisecond, ms - ezredmásodperc
  • quarter, qq, q – negyedév. 1 és 4 közötti szám.
  • dayofyear, dy, y – a nap sorszáma az adott évben
  • week, wk, ww – a hét sorszáma az adott évben
  • weekday, dw – a nap sorszáma a héten belül. Az, hogy a hétnek melyik az első napja az változó. Ha szeretnénk, hogy hétfő legyen az elsőnek tekintendő, akkor adjuk ki a set datefirst 1 utasítást.
Visszatérési érték: integer
set datefirst 1
SELECT
  DATEPART(year, GETDATE()) as 'Év',
  DATEPART(month, GETDATE()) as 'Hónap',
  DATEPART(day, GETDATE()) as 'Nap',
  DATEPART(hour, GETDATE()) as 'Óra',
  DATEPART(minute, GETDATE()) as 'Perc',
  DATEPART(second, GETDATE()) as 'Másodperc',
  DATEPART(millisecond, GETDATE()) as 'Ezredmásodperc',
  DATEPART(quarter, GETDATE()) as 'Negyedév',
  DATEPART(dayofyear, GETDATE()) as 'Év napja',
  DATEPART(week, GETDATE()) as 'Hét',
  DATEPART(weekday, GETDATE()) as 'Hét napja'

03.sql: Year, Month, Day
Egy dátum adatból lehetőségünk van egy másik módszerrel is kinyerni a részadatokat.
A Year függvény az évszámot adja vissza, a Month a hónapot, míg a Day az adott napot.
Visszatérési érték, mindhárom esetben: integer
select year(GetDate()) as 'Év', month(GetDate()) as 'Hónap', day(GetDate()) as 'Nap'

04.sql: DateName
A hónapoknak, illetve a hét napjainak nem csak sorszáma, hanem megnevezése is van. Ezt a szöveget is megtudhatjuk az SQL szervertől a DateName függvény használatával. Első paraméterként a 2. példában megismert konstansok közül kell a month, vagy a weekday-t használni. Második paraméterként egy datetime típusú adatot adhatunk meg. A visszaadott szöveg nyelve függ az aktuálisan kiválasztott nyelvtől, melyet a SET LANGUAGE hívásával tetszőlegesre állíthatunk.
Visszatérési érték: nvarchar
SET LANGUAGE 'Hungarian'
SELECT DATENAME(month, getdate()) AS 'Hónap', DATENAME(weekday, getdate()) AS 'Hét napja'

05.sql: GetUTCDate
A pontos időmeghatározására Greenwich-i idő szerint is van lehetőségünk. Ehhez a GetUTCDate függvényt kell csupán meghívnunk.
select GetDate() as 'Dátum és ido', GETUTCDATE() as 'UTC dátum és ido'

06.sql: DateAdd
Dátum és időpont értéket tetszőleges mértékben és egységben növelhetünk a DateAdd függvény használatával.
Első paraméterként a növelési egységet kell megadnunk, melyet a második példában látható felsorolásból választhatunk ki. Második paraméter a növelés mértéke, míg a végső paraméter az a datetime típusú érték, melyet növelni szeretnénk.
Visszatérési érték: datetime
SELECT GetDate() as 'Ma',
  DATEADD(day, 100, GetDate()) as '100 nap múlva...',
  DATEADD(year, 1, DATEADD(day, 10, GetDate())) as '1 év és 10 nap múlva...'

07.sql: DateDiff
Ha szükséges tudnunk, hogy két datetime típusú adat között mekkora az eltérés egy általunk megadott egységben, akkor a DateDiff függvény használatával könnyedén szert tehetünk erre az információra.
Első paraméterben a 2. példánál lévő felsorolásból választhatjuk ki, hogy milyen egységben szeretnénk visszakapni az a két dátum közötti időt. A következő két paraméterben pedig a két datetime típusú adatot kell megadnunk.
Visszatérési érték: integer
SET DATEFORMAT ymd
SELECT GetDate() as 'Ma',
  DATEDIFF(day, convert(datetime, '2000-01-01'), GetDate()) as '2000. 01. 01. óta hány nap telt el?'

08.sql
Utolsó dátumos példánkban pedig nézzünk egy gyakorlati feladatot, mely legyen a következő: a Northwind példa adatbázis Orders táblájából készítsünk egy olyan táblázatot, melyben az 1997-évi tételek szerepelnek havi bontásban, megszámlálva, hogy egy-egy hónapban hány tétel került eltárolásra. Az eredmény halmazt úgy rendezzük, hogy ott a hónapok nevei a hónapoknak megfelelő sorrendben jelenjenek meg.
A megvalósításhoz az alábbi select-et kell megfogalmaznunk:
set language 'Hungarian'
SELECT     DATENAME(month, OrderDate) AS 'Hónap', COUNT(*) AS 'Darab'
FROM         Orders
WHERE     (DATEPART(year, OrderDate) = 1997)
GROUP BY DATENAME(month, OrderDate), DATEPART(month, OrderDate)
ORDER BY DATEPART(month, OrderDate)
Első lépésként beállítjuk a magyar nyelvet, mely a DatePart függvény miatt lesz érdekes. Az eredmény tábla első oszlopába írjuk a hónapok neveit, a másodikba jön a darabszám. Where feltételként megadjuk az 1997-es évet. A számlálás miatt végzünk egy csoportosítást a hónapok neveire a DateName függvénnyel, majd az adatokat a DatePart függvény által szolgáltatott hónapok sorszámai alapján végezzük el, hiszen ha a hónap neveit használnánk, akkor ott nem a Január lenne az első, az ABC sorrend miatt.


Transact SQL cikksorozat