[ 26. May 2000]
- Jany_Masaryk
Dátové funkcie a práca s nimi v ASP stránkach a MS SQLServer
Tento tip vznikol na základe otázok nášho čitateľa:
Robím databázu v SQLserver7.0. Chcem používať dátum ako kritérium zobrazovania údajov z tabuľky.
Mám stĺpec s menom Datum a do neho zapisujem cez ASP dátum funkciou Date(). Dátum v tomto stĺpci je vo formáte 4.4.2000.
Potrebujem napísať ASP, ktoré mi podľa týchto dátumov bude zobrazovat údaje z celej tabuľky.
Problém začína tu :
Ja to potrebujem tak, aby mi ukazoval údaje, ktoré su X dni staré, teda všetky od (dnešný dátum - X) väčšie. Keď napíšem do ASP že
Select * from tab_name where Datum >= Date() - X
tak proste mi vyhodí nejakú chybu. Vieš mi please poradiť presnú syntax, že ako to dosiahnem?
Riešenie 1 :
Takže riešení je niekoľko, ale popíšem iba jedno. Predpokladajme, že máme nasledovnú tabuľku News :
Názov stĺpca |
Typ hodnôt |
News_ID |
int (pričom je tento atribút zároveň primárnym kĺúčom a tiež "identity") |
News_Title |
varchar(50) |
News_Date |
datetime |
Z danej tabuľky chceme zobrazovať položky, ktoré sú X dní staré. Doležité je si uvedomiť, že oddelenie logiky funkčnej od logiky databázovej je
pomerne podstatná vec, ktorá napríklad umožňuje meniť databázový server bez nutnosti zasahovať do ASP stránok. Upraví sa len databazová časť. To znamená,
neodporúča sa "na tvrdo" písať SQL príkaz do ASP stránky. Miesto toho zostavíme uloženú procedúru. Kedže otázka je kladená na SQL Server
tu je príklad procedúry uplatnenej na tabulku News :
Set Dateformat dmy
CREATE PROCEDURE Xnew
@days int
AS
SELECT News_ID, News_Title, News_Date
FROM News
WHERE (DATEDIFF(dd, News_Date, getdate()) <= @days) AND (DATEDIFF(dd, News_Date, getdate()) > -1)
ORDER BY News_Date DESC
pričom procedúru voláme z ASP stránky pomocou príkazu strSQL, kde X je počet dní teda integer číslo :
strSQL = "EXECUTE Xnew @days=" & X
Tým dostaneme správy staré X dní. Prvý príkaz nastaví aký bude dátumový formát v databáze.
Parameter sa zostaví pomocou y(year), m(month) a d(day). Zvyšok je klasické zostavenie procedúry. Za zmienku stojí
príkaz DATEDIFF. Bližšie v prehľade číslo 2 dole ... Získané výsledku už iba naplníme do Recordsetu a môžeme ich
ďaľej použiť.
Problém 2 :
Ešte ďaľšia vec: Neviem, že v akom formáte mám mať ten dátumový stĺpec. Mám
ho ako Datetime momentálne. Čítal som však, ze tieto dátumové záležitosti sú
dosť citlivé na formát dátumu. Ten sa dá nejak nastaviť, zmeniť, určiť? Ale
keď predsa používam serverový dátum ako na zápis tak aj na čítanie z
databázy, malo by to byť, jedno, nie?
Riešenie 2 :
Tento problém poznám. Najlepšie je nastaviť si v databáze jeden formát pomocou príkazu :
Set Dateformat dmy
a v ASP stránkach už iba upravovať dátum pomocou VBScriptových funkcií, ktorých prehľad je nižšie.
Prehľad 1.
Prehľad užitočných dátumovo-časových funkcií vo VBScripte :
Dátové funkcie VBScriptu |
Funkcia |
Syntax |
Ukážka |
Now() |
|
11.4.2000 17:20:26 |
Time() |
|
17:20:26 |
Date() |
|
11.4.2000 |
Day() |
Day(dátum) |
11 |
Month() |
Month(dátum) |
4 |
Year() |
Year(dátum) |
2000 |
Hour() |
Hour(čas) |
17 |
Minute() |
Minute(čas) |
20 |
Second() |
Second(čas) |
26 |
Weekday() |
Weekday(dátum,[prvý deň týždňa]) napr.: Weekday(Date(),Monday) |
2 |
Prehľad 2.
Prehľad dátumových a časových funkcií v T-SQL.
Dátové funkcie T-SQL |
Funkcia |
Parametre |
Ukážka |
DATENAME(datepart,date)
vyberie menu časti dátumu
|
datepart - year, quarter, month, dayofyear, day, week, weekday, hour, minute, second, millisecond
date - dátum
|
Select datename(month,getdate())
Result : April
|
DATEPART(datepart,date)
vyberie časť dátumu
|
datepart - year, quarter, month, dayofyear, day, week, weekday, hour, minute, second, millisecond
date - dátum
|
Select datepart(day,getdate())
Result : 11
|
DATEADD(datepart,number,date)
vracia novú dátumovú hodnotu vypočítanú na základe pridaného intervalu špecifikovaného dátumu
|
datepart - year, quarter, month, dayofyear, day, week, weekday, hour, minute, second, millisecond
number - o koľko sa má zvýšiť daná hodnota
date - dátum
|
Select dateadd(day,5,getdate())
Result : 2000-04-16 17:07:40.437
|
DATEDIFF(datepart, startdate, enddate)
vracia číslo vychádzajúce z porovnania dvoch dátumov resp. časov pomocou parametra datepart
|
datepart - year, quarter, month, dayofyear, day, week, weekday, hour, minute, second, millisecond
startdate - začiatok kalkulácie
enddate - koniec kalkulácie
|
Select datediff(day,'04.04.2000',getdate())
Result : 7
|
|
|
|