操作日期和時間
日期和時間函數(shù)對建立一個站點是非常有用的。站點的主人往往對一個表中的數(shù)據(jù)何時被更新感興趣。通過日期和時間函數(shù),你可以在毫秒級跟蹤一個表的改變。
返回當(dāng)前日期和時間
通過函數(shù)GETDATE(),你可以獲得當(dāng)前的日期和時間。例如,語句SELECT GETDATE()返回如下的結(jié)果:
……………………………..
NOV 30 1997 3:29AM
(1 row(s) affected)
顯然,如果你將來使用這個函數(shù),你得到的日期將比這個時間晚,或者梗早。
函數(shù)GETDATE()可以用來作為DATEDIME()型字段的缺省值。這對插入記錄時保存當(dāng)時的時間是有用的。例如,假設(shè)有一個表用來保存你站點上的活動日志。每當(dāng)有一個訪問者訪問到你的站點時,就在表中添加一條新記錄,記下訪問者的名字,活動,和進(jìn)行訪問的時間。要建立一個表,其中的記錄包含有當(dāng)前的日期和時間,可以添加一個DATETIME型字段,指定其缺省值為函數(shù)GETDATE()的返回值,就象這樣:
CREATE TABLE site_log (
username VARCHAR(40),
useractivity VARCHAR(100),
entrydate DATETIME DEFAULT GETDATE())
轉(zhuǎn)換日期和時間
你也許已經(jīng)注意到,在上一節(jié)的例子中,函數(shù)GETDATE()的返回值在顯示時只顯示到秒。實際上,SQL Sever內(nèi)部時間可以精確到毫秒級(確切地說,可以精確到3.33毫秒)。
要得到不同格式的日期和時間,你需要使用函數(shù)CONVERT()。例如,當(dāng)下面的這個語句執(zhí)行時,顯示的時間將包括毫秒:
SELECT CONVERT(VARCHAR(30),GETDATE(),9)
注意例子中數(shù)字9的使用。這個數(shù)字指明了在顯示日期和時間時使用哪種日期和時間格式。當(dāng)這個語句執(zhí)行時,將顯示如下的日期和時間:
…………………………………..
Nov 30 1997 3:29:55:170AM
(1 row(s) affected)
在函數(shù)CONVERT()中你可以使用許多種不同風(fēng)格的日期和時間格式。表11.1顯示了所有的格式。
表11.1 日期和時間的類型
類型值 標(biāo)準(zhǔn) 輸出
0 Default mon dd yyyy hh:miAM
1 USA mm/dd/yy
2 ANSI yy.mm.dd
3 British/French dd/mm/yy
4 German dd.mm.yy
5 Italian dd-mm-yy
6 – dd mon yy
7 – mon dd,yy
8 – hh:mi:ss
Default + milliseconds–mon dd yyyy
hh:mi:ss:mmmAM(or )
10 USA mm-dd-yy
11 JAPAN yy/mm/dd
12 ISO yymmdd
13 Europe Default + milliseconds–dd mon yyyy
hh:mi:ss:mmm(24h)
14 – hh:mi:ss:mmm(24h)
類型0,9,和13總是返回四位的年。對其它類型,要顯示世紀(jì),把style值加上100。類型13和14返回24小時時鐘的時間。類型0,7,和13返回的月份用三位字符表示(用Nov代表November).
對表11.1中所列的每一種格式,你可以把類型值加上100來顯示有世紀(jì)的年(例如,00年將顯示為2000年)。例如,要按日本標(biāo)準(zhǔn)顯示日期,包括世紀(jì),你應(yīng)使用如下的語句:
SELECT CONVERT(VARCHAR(30),GETDATE(),111)
在這個例子中,函數(shù)CONVERT()把日期格式進(jìn)行轉(zhuǎn)換,顯示為1997/11/30
抽取日期和時間
在許多情況下,你也許只想得到日期和時間的一部分,而不是完整的日期和時間。例如,假設(shè)你想列出你的站點目錄中每個站點被查詢的月份。這時你不希望完整的日期和時間把網(wǎng)頁弄亂。為了抽取日期的特定部分,你可以使用函數(shù)DATEPART(),象這樣:
SELECT site_name ‘Site Name’,
DATEPART(mm,site_entrydate) ‘Month Posted’ FROM site_directory
函數(shù)DATEPART()的參數(shù)是兩個變量。第一個變量指定要抽取日期的哪一部分;第二個變量是實際的數(shù)據(jù)。在這個例子中,函數(shù)DATEPART()抽取月份,因為mm代表月份。下面是這個SELECT 語句的輸出結(jié)果:
Site Name Month Posted
………………………………………………………………
Yahoo 2
Microsoft 5
Magicw3 5
(3 row(s) affected)
Month Posted列顯示了每個站點被查詢的月份。函數(shù)DATEPART()的返回值是一個整數(shù)。你可以用這個函數(shù)抽取日期的各個不同部分,如表11.2所示。
表11.2 日期的各部分及其簡寫
日期部分 簡寫 值
year yy 1753–9999
quarter QQ 1–4
month mm 1–12
day of year dy 1–366
day dd 1–31
week wk 1–53
weekday dw 1–7(Sunday–Saturday)
hour hh 0–23
minute mi 0–59
second ss 0–59
milisecond ms 0–999
當(dāng)你需要進(jìn)行日期和時間的比較時,使用函數(shù)DATEPART()返回整數(shù)是有用的。但是,上例中的查詢結(jié)果(2,5)不是十分易讀。要以更易讀的格式得到部分的日期和時間,你可以使用函數(shù)DATENAME(),如下例所示:
SELECT site_name ‘Site Name’
DATENAME(mm,site_entrydate) ‘Month Posted’
FROM site_directory
函數(shù)DATENAME()和函數(shù)DATEPART()接收同樣的參數(shù)。但是,它的返回值是一個字符串,而不是一個整數(shù)。下面是上例該用DATENAME()得到的結(jié)果:
Site Name Month Postec
………………………………………………………………….
Yahoo February
Microsoft June
Magicw3 June
(3 row(s) affected)
你也可以用函數(shù)DATENAE()來抽取一個星期中的某一天。下面的這個例子同時抽取一周中的某一天和日期中的月份:
SELECT site_name ‘Site Name’,
DATENAME(dw,site_entrydate)+ ‘-’ + DATENAME(mm,site_entrydate)
‘Day and Month Posted’ FORM site_directory
這個例子執(zhí)行時,將返回如下的結(jié)果:
Site Name Day and Month Posted
………………………………………………………………………
Yahoo Friday – February
Microsoft Tuesday – June
Magicw3 Monday – June
(3 row(s) affected)
返回日期和時間范圍
當(dāng)你分析表中的數(shù)據(jù)時,你也許希望取出某個特定時間的數(shù)據(jù)。你也許對特定的某一天中――比如說2000年12月25日――訪問者在你站點上的活動感興趣。要取出這種類型的數(shù)據(jù),你也許會試圖使用這樣的SELECT語句:
SELECT * FROM weblog WHERE entrydate=”12/25/20000”
不要這樣做。這個SELECT語句不會返回正確的記錄――它將只返回日期和時間是12/25/2000 12:00:00:000AM的記錄。換句話說,只有剛好在午夜零點輸入的記錄才被返回。
注意:
在本節(jié)的討論中,假設(shè)字段entrydate是DATETIME型,而不是SMALLDATETIME型。本節(jié)的討論對SMALLDATETIME型字段也是適用的,不過SMALLDATETIME型字段只能精確到秒。
問題是SQL Sever將用完整的日期和時間代替部分日期和時間。例如,當(dāng)你輸入一個日期,但不輸入時間時,SQL Sever將加上缺省的時間“12:00:00:000AM”。當(dāng)你輸入一個時間,但不輸入日期時,SQL Sever將加上缺省的日期“Jan 1 1900”。
要返回正確的記錄,你需要適用日期和時間范圍。有不止一種途徑可以做到這一點。例如,下面的這個SELECT 語句將能返回正確的記錄:
SELECT * FROM weblog
WHERE entrydate>=”12/25/2000” AND entrydate
這個語句可以完成任務(wù),因為它選取的是表中的日期和時間大于等于12/25/2000 12:00:00:000AM并小于12/26/2000 12:00:00:000AM的記錄。換句話說,它將正確地返回2000年圣誕節(jié)這一天輸入的每一條記錄。
另一種方法是,你可以使用LIKE來返回正確的記錄。通過在日期表達(dá)式中包含通配符“%”,你可以匹配一個特定日期的所有時間。這里有一個例子:
SELECT * FROM weblog WHERE entrydate LIKE ‘Dec 25 2000%’
這個語句可以匹配正確的記錄。因為通配符“%”代表了任何時間。
使用這兩種匹配日期和時間范圍的函數(shù),你可以選擇某個月,某一天,某一年,某個小時,某一分鐘,某一秒,甚至某一毫秒內(nèi)輸入的記錄。但是,如果你使用LIKE 來匹配秒或毫秒,你首先需要使用函數(shù)CONVERT()把日期和時間轉(zhuǎn)換為更精確的格式(參見前面“轉(zhuǎn)換日期和時間”一節(jié))。
比較日期和時間
最后,還有兩個日期和時間函數(shù)對根據(jù)日期和時間取出記錄是有用的。使用函數(shù)DATEADD()和DATEDIFF(),你可以比較日期的早晚。例如,下面的SELECT語句將顯示表中的每一條記錄已經(jīng)輸入了多少個小時:
SELECT entrydate ‘Time Entered’
DATEDIFF(hh,entrydate,GETDATE()) ‘Hours Ago’ FROM weblog
如果當(dāng)前時間是2000年11月30號下午6點15分,則會返回如下的結(jié)果:
Time Entered Hours Ago
…………………………………………………..
Dec 30 2000 4:09PM 2
Dec 30 2000 4:13PM 2
Dec 1 2000 4:09PM 698
(3 row(s) affected)
函數(shù)DADEDIFF()的參數(shù)是三個變量。第個變量指定日期的某一部分。在這個例子中,是按小時對日期進(jìn)行比較,(要了解日期各部分的詳細(xì)內(nèi)容,請參考表11.2)在日期2000年11月1日和2000年11月30日的指定時間之間有689個小時。另外兩個參數(shù)是要進(jìn)行比較的時間。為了返回一個正數(shù),較早的時間應(yīng)該先給。
函數(shù)DATEADD()把兩個日期相加。當(dāng)你需要計算截止日期這一類的數(shù)據(jù)時,這個函數(shù)是有用處的。例如,假設(shè)訪問者必須先注冊才能使用你的站點。注冊以后,他們可以免費使用你的站點一個月。要確定什么時候他們的免費時間會用完,你可以使用如下的SELECT語句:
SELECT username ‘User Name’,
DATEADD(mm,1,firstvisit_date) ‘Registration Expires’
FROM registration_table
函數(shù)DATEADD()的參數(shù)有三個變量。第一個變量代表日期的某一部分(參見表11.2),這個例子用到了代表月份的mm。第二個變量指定了時間的間隔――在本例中是一個月。最后一個變量是一個日期,在這個例子中,日期是取自DATETIME型字段firstvisit_date.假設(shè)當(dāng)前日期是June 30,2000,這個語句將返回如下的內(nèi)容:
User Name Registration Expires
……………………………………………………………………………
Bill Gates Jul 30 2000 4:09PM
PResident Clinton Jul 30 2000 4:13PM
William Shakespeare Jul 1 2000 4:09PM
(3 row(s) affected)
注意:
與你預(yù)料的相反,使用函數(shù)DATEADD()把一個日期加上一個月,它并不加上30天。這個函數(shù)只簡單地把月份值加1。這意味著在11月注冊的人將比在2月注冊的人多得到2天或3天的時間。要避免這個問題,你可以用函數(shù)DATEADD()直接增加天數(shù),而不是月份。
發(fā)送郵件
你可以用SQL Sever發(fā)送簡單的e_mail信息。要做到這一點,你需要在你的系統(tǒng)中安裝郵件服務(wù)器,如Microsoft Exchange Sever(參見第四章“Exchange Active Sever,Index Sever,和NetShow”)。你還需要配置SQL Sever 以識別郵件服務(wù)器。
要讓SQL Sever 能識別郵件服務(wù)器,啟動事務(wù)管理器并從菜單中選擇Sever|SQL Mail|Configue,這時會出現(xiàn)一個如圖11.3所示的對話框。輸入你在郵件服務(wù)器中注冊的用戶名和口令,然后單擊OK。
注意:
如果你使用Microsoft Exchange Sever,配置SQL Sever的過程將會大大不同。你需要在同一個(域)用戶帳號下運行Microsoft SQL Sever和Exchange Sever。你還需要在安裝了SQL Sever的機器上安裝Exchange Cliect并給這個帳號創(chuàng)建一個一個配置文件。完成這些之后,你就可以在SQL Mail Configuration對話框中輸入該配置文件的名字。
圖11。3
在發(fā)送郵件之前,你要先啟動SQL Mail。從菜單中選擇Sever|SQL Mail|Start。如果你的郵件服務(wù)器配置正確,并且你輸入了正確的用戶名和口令,則SQL Mail會成功啟動。
注意:
你可以把SQL Sever配置為自動啟動郵件服務(wù)。要做到這一點,在Set Sever Optons對話框(從菜單中選擇Sever|SQL Sever|Configure)中選擇Auto Start Mail Client即可。
要發(fā)送一個郵件,你可以使用名為xp_sendmail的擴展存儲過程。這里有一個如何使用這個過程的例子:
master..xp_sendmail “president@whitehouse.gov”,”Hello Mr. President”
這個過程調(diào)用向e_mail地址president@whitehouse.gov發(fā)送一個簡單的email信息:“Hello Mr. President”。你可以用任何其它的email地址和信息取代上例中相應(yīng)的內(nèi)容,但是,你所發(fā)送的信息不能超過255個字符長度。
當(dāng)你想隨時了解你的站點數(shù)據(jù)庫的狀態(tài)時,存儲過程xp_sendmail是有用處的。例如,你可以向一個頁面管理程序發(fā)送信息。如果你的站點出了什么問題,你馬上就可以知道。下一章將講述更多有關(guān)存儲過程的內(nèi)容。
總結(jié)
這一章加深了你的SQL知識。你學(xué)會了如何建立索引,使你的查詢速度更快。你還學(xué)會了如何插入,刪除和更新一個表中的數(shù)據(jù),如何使用集合函數(shù)得到一個表中數(shù)據(jù)的統(tǒng)計信息。最后,你學(xué)會了許多有價值的表達(dá)式,函數(shù)和過程,用來操作字符串,日期和時間及郵件。
下一章將進(jìn)一步加深你對Microsoft SQL Sever的掌握。你將學(xué)習(xí)如何用SQL來進(jìn)行程序設(shè)計,如何建立存儲過程,觸發(fā)器和執(zhí)行計劃。更另人興奮的是,你將學(xué)會讓SQL Sever自動創(chuàng)建網(wǎng)頁的一個簡單方法。
?以上就是sql數(shù)據(jù)操作基礎(chǔ)(中級)10的內(nèi)容,更多相關(guān)文章請關(guān)注php中文網(wǎng)(www.php.cn)!?