操作日期和時間
日期和時間函數對建立一個站點是非常有用的
站點的主人往往對一個表中的數據何時被更新感興趣
通過日期和時間函數
你可以在毫秒級跟蹤一個表的改變
返回當前日期和時間
通過函數GETDATE()
你可以獲得當前的日期和時間
例如
語句SELECT GETDATE()返回如下的結果
……………………………
NOV
:
AM
(
row(s) affected)
顯然
如果你將來使用這個函數
你得到的日期將比這個時間晚
或者梗早
函數GETDATE()可以用來作為DATEDIME()型字段的缺省值
這對插入記錄時保存當時的時間是有用的
例如
假設有一個表用來保存你站點上的活動日志
每當有一個訪問者訪問到你的站點時
就在表中添加一條新記錄
記下訪問者的名字
活動
和進行訪問的時間
要建立一個表
其中的記錄包含有當前的日期和時間
可以添加一個DATETIME型字段
指定其缺省值為函數GETDATE()的返回值
就象這樣
CREATE TABLE site_log (
username VARCHAR(
)
useractivity VARCHAR(
)
entrydate DATETIME DEFAULT GETDATE())
轉換日期和時間
你也許已經注意到
在上一節的例子中
函數GETDATE()的返回值在顯示時只顯示到秒
實際上
SQL Sever內部時間可以精確到毫秒級(確切地說
可以精確到
毫秒)
要得到不同格式的日期和時間
你需要使用函數CONVERT()
例如
當下面的這個語句執行時
顯示的時間將包括毫秒
SELECT CONVERT(VARCHAR(
)
GETDATE()
)
注意例子中數字
的使用
這個數字指明了在顯示日期和時間時使用哪種日期和時間格式
當這個語句執行時
將顯示如下的日期和時間
…………………………………
Nov
:
:
:
AM
(
row(s) affected)
在函數CONVERT()中你可以使用許多種不同風格的日期和時間格式
表
顯示了所有的格式
表
日期和時間的類型
類型值 標准 輸出
Default mon dd yyyy hh:miAM
USA mm/dd/yy
ANSI yy
mm
dd
British/French dd/mm/yy
German dd
mm
yy
Italian dd
mm
yy
dd mon yy
mon dd
yy
hh:mi:ss
Default + milliseconds
mon dd yyyy
hh:mi:ss:mmmAM(or )
USA mm
dd
yy
JAPAN yy/mm/dd
ISO yymmdd
Europe Default + milliseconds
dd mon yyyy
hh:mi:ss:mmm(
h)
hh:mi:ss:mmm(
h)
類型
和
總是返回四位的年
對其它類型
要顯示世紀
把style值加上
類型
和
返回
小時時鐘的時間
類型
和
返回的月份用三位字符表示(用Nov代表November)
對表
中所列的每一種格式
你可以把類型值加上
來顯示有世紀的年(例如
年將顯示為
年)
例如
要按日本標准顯示日期
包括世紀
你應使用如下的語句
SELECT CONVERT(VARCHAR(
)
GETDATE()
)
在這個例子中
函數CONVERT()把日期格式進行轉換
顯示為
/
/
抽取日期和時間
在許多情況下
你也許只想得到日期和時間的一部分
而不是完整的日期和時間
例如
假設你想列出你的站點目錄中每個站點被查詢的月份
這時你不希望完整的日期和時間把網頁弄亂
為了抽取日期的特定部分
你可以使用函數DATEPART()
象這樣
SELECT site_name
Site Name
DATEPART(mm
site_entrydate)
Month Posted
FROM site_directory
函數DATEPART()的參數是兩個變量
第一個變量指定要抽取日期的哪一部分
第二個變量是實際的數據
在這個例子中
函數DATEPART()抽取月份
因為mm代表月份
下面是這個SELECT 語句的輸出結果
Site Name Month Posted
………………………………………………………………
Yahoo
Microsoft
Magicw
(
row(s) affected)
Month Posted列顯示了每個站點被查詢的月份
函數DATEPART()的返回值是一個整數
你可以用這個函數抽取日期的各個不同部分
如表
所示
表
日期的各部分及其簡寫
日期部分 簡寫 值
year yy
quarter qq
month mm
day of year dy
day dd
week wk
weekday dw
(Sunday
Saturday)
hour hh
minute mi
second ss
milisecond ms
當你需要進行日期和時間的比較時
使用函數DATEPART()返回整數是有用的
但是
上例中的查詢結果(
)不是十分易讀
要以更易讀的格式得到部分的日期和時間
你可以使用函數DATENAME()
如下例所示
SELECT site_name
Site Name
DATENAME(mm
site_entrydate)
Month Posted
FROM site_directory
函數DATENAME()和函數DATEPART()接收同樣的參數
但是
它的返回值是一個字符串
而不是一個整數
下面是上例該用DATENAME()得到的結果
Site Name Month Postec
…………………………………………………………………
Yahoo February
Microsoft June
Magicw
June
(
row(s) affected)
你也可以用函數DATENAE()來抽取一個星期中的某一天
下面的這個例子同時抽取一周中的某一天和日期中的月份
SELECT site_name
Site Name
DATENAME(dw
site_entrydate)+
+ DATENAME(mm
site_entrydate)
Day and Month Posted
FORM site_directory
這個例子執行時
將返回如下的結果
Site Name Day and Month Posted
………………………………………………………………………
Yahoo Friday
February
Microsoft Tuesday
June
Magicw
Monday
June
(
row(s) affected)
返回日期和時間范圍
當你分析表中的數據時
你也許希望取出某個特定時間的數據
你也許對特定的某一天中――比如說
年
月
日――訪問者在你站點上的活動感興趣
要取出這種類型的數據
你也許會試圖使用這樣的SELECT語句
SELECT * FROM weblog WHERE entrydate=
/
/
不要這樣做
這個SELECT語句不會返回正確的記錄――它將只返回日期和時間是
/
/
:
:
:
AM的記錄
換句話說
只有剛好在午夜零點輸入的記錄才被返回
注意
在本節的討論中
假設字段entrydate是DATETIME型
而不是SMALLDATETIME型
本節的討論對SMALLDATETIME型字段也是適用的
不過SMALLDATETIME型字段只能精確到秒
問題是SQL Sever將用完整的日期和時間代替部分日期和時間
例如
當你輸入一個日期
但不輸入時間時
SQL Sever將加上缺省的時間
AM
當你輸入一個時間
但不輸入日期時
SQL Sever將加上缺省的日期
Jan
要返回正確的記錄
你需要適用日期和時間范圍
有不止一種途徑可以做到這一點
例如
下面的這個SELECT 語句將能返回正確的記錄
SELECT * FROM weblog
WHERE entrydate>=
/
/
AND entrydate<
/
/
這個語句可以完成任務
因為它選取的是表中的日期和時間大於等於
/
/
:
:
:
AM並小於
/
/
:
:
:
AM的記錄
換句話說
它將正確地返回
年聖誕節這一天輸入的每一條記錄
另一種方法是
你可以使用LIKE來返回正確的記錄
通過在日期表達式中包含通配符
%
你可以匹配一個特定日期的所有時間
這裡有一個例子
SELECT * FROM weblog WHERE entrydate LIKE
Dec
%
這個語句可以匹配正確的記錄
因為通配符
%
代表了任何時間
使用這兩種匹配日期和時間范圍的函數
你可以選擇某個月
某一天
某一年
某個小時
某一分鐘
某一秒
甚至某一毫秒內輸入的記錄
但是
如果你使用LIKE 來匹配秒或毫秒
你首先需要使用函數CONVERT()把日期和時間轉換為更精確的格式(參見前面
轉換日期和時間
一節)
比較日期和時間
最後
還有兩個日期和時間函數對根據日期和時間取出記錄是有用的
使用函數DATEADD()和DATEDIFF()
你可以比較日期的早晚
例如
下面的SELECT語句將顯示表中的每一條記錄已經輸入了多少個小時
SELECT entrydate
Time Entered
DATEDIFF(hh
entrydate
GETDATE())
Hours Ago
FROM weblog
如
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22134.html