SQL語句獲取特定日期
一個月第一天的
Select DATEADD(mm DATEDIFF(mmgetdate()) )
本周的星期一
Select DATEADD(wk DATEDIFF(wkgetdate()) )
一年的第一天
Select DATEADD(yy DATEDIFF(yygetdate()) )
季度的第一天
Select DATEADD(qq DATEDIFF(qqgetdate()) )
當天的半夜
Select DATEADD(dd DATEDIFF(ddgetdate()) )
上個月的最後一天
Select dateadd(msDATEADD(mm DATEDIFF(mmgetdate()) ))
去年的最後一天
Select dateadd(msDATEADD(yy DATEDIFF(yygetdate()) ))
本月的最後一天
Select dateadd(msDATEADD(mm DATEDIFF(mgetdate())+ ))
本年的最後一天
Select dateadd(msDATEADD(yy DATEDIFF(yygetdate())+ ))
本月的第一個星期一
select DATEADD(wk DATEDIFF(wkdateadd(dddatepart(daygetdate())getdate())) )
返回當前日期和時間
通過函數GETDATE()你可以獲得當前的日期和時間函數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 yymmdd
British/French dd/mm/yy
German ddmmyy
Italian ddmmyy
dd mon yy
mon ddyy
hh:mi:ss
Default + millisecondsmon dd yyyy
hh:mi:ss:mmmAM(or )
USA mmddyy
JAPAN yy/mm/dd
ISO yymmdd
Europe Default + millisecondsdd 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(mmsite_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 (SundaySaturday)
hour hh
minute mi
second ss
milisecond ms
當你需要進行日期和時間的比較時使用函數DATEPART()返回整數是有用的但是上例中的查詢結果()不是十分易讀要以更易讀的格式得到部分的日期和時間你可以使用函數DATENAME()如下例所示
Select site_name ‘Site Name’
DATENAME(mmsite_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(dwsite_entrydate)+ ‘’ + DATENAME(mmsite_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的記錄換句話說只有剛好在午夜零點輸入的記錄才被返回
問題是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(hhentrydateGETDATE()) ‘Hours Ago’ FROM weblog
如果當前時間是年月號下午點分則會返回如下的結果
Time Entered Hours Ago
…………………………………………………
Dec :PM
Dec :PM
Dec :PM
( row(s) affected)
函數DADEDIFF()的參數是三個變量第個變量指定日期的某一部分在這個例子中是按小時對日期進行比較(要了解日期各部分的詳細內 容請參考表 )在日期年月日和年月日的指定時間之間有個小時另外兩個參數是要進行比較的時間為了返回一個正數較早 的時間應該先給
函數DATEADD()把兩個日期相加當你需要計算截止日期這一類的數據時這個函數是有用處的假如你要查詢一個月前注冊用戶的記錄你可以使用如下的Select語句
Select username ‘User Name’
DATEADD(mmfirstvisit_date) ‘Registration Expires’
FROM registration_table
函數DATEADD()的參數有三個變量第一個變量代表日期的某一部分這個例子用到了代表月份的mm第二個變量指定了時間的間隔――在本 例中是一個月最後一個變量是一個日期在這個例子中日期是取自DATETIME型字段firstvisit_date假設當前日期是June 這個語句將返回如下的內容
User Name Registration Expires
……………………………………………………………………………
Bill Gates Jul :PM
President Clinton Jul :PM
William Shakespeare Jul :PM
( row(s) affected)
注意
使用函數DATEADD()把一個日期加上一個月它並不加上天這個函數只簡單地把月份值加
From:http://tw.wingwit.com/Article/program/MySQL/201311/29539.html