熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL Server如何進行時間比較的代碼實例

2013-11-15 14:47:33  來源: SQL Server 

  例子:

select count(*) from table where DATEDIFF ([second] :: ::)  >

說明

select  DATEDIFF(day time time)    對應示例語句如下


select  DATEDIFF(day :: ::)

time > time 為負數;

time < time 為正數;

[day] :只會比較 忽略 :: 其他同理

以下分別:

 

年: SELECT DATEDIFF([year]time time)   返回值 說明是後減前 與 mysql教程 相反的

月: SELECT DATEDIFF([month] time time)


天: SELECT DATEDIFF([day] time time)


小時: SELECT DATEDIFF([hour] time time)

秒: SELECT DATEDIFF([second] time time)


通過函數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()wwwpptcom來抽取一個星期中的某一天下面的這個例子同時抽取一周中的某一天和日期中的月份

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()把一個日期加上一個月它並不加上這個函數只簡單地把月份值加


用northwind庫中的employees表作為用例表
betweenand語句的使用:
說明:betweenand用於指定測試范圍
看以下實例:
執行sql語句“SELECT hiredate FROM employees”顯示結果如下:
hiredate
::
::
::
::
::
::
::
::
::

從以上結果集中搜索出hiredate在""到""的記錄則sql語句如下:
SELECT hiredate
FROM employees
WHERE hiredate between cast( as datetime) and cast( as datetime)
執行該語句後結果如下:
hiredate
::
::
::
以上sql語句中出現betweenand和cast其中cast是類型轉換函數:在該例中將字符串轉換成日期型值
在WHERE中用betweenand把""到""的記錄搜索出來

兩個日期值的比較大小可以用< <= > >=運算符和datediff函數
datediff函數:DATEDIFF ( datepart startdate enddate )
datepart的取值可以是yearquarterMonthdayofyearDayWeekHourminutesecondmillisecond
startdate 是從 enddate 減去如果 startdate 比 enddate 晚返回負值
看以下實例:
搜索hiredate的值在""後的記錄該sql語句如下:
SELECT hiredate
FROM employees
WHERE datediff(daycast( as datetime)hiredate) >
執行該語句後結果如下:
hiredate
::
::
::
::
::
因此datediff(daycast( as datetime)hiredate)是把hiredate的值按"day"減去cast( as datetime)
的值通過判定相減後值的正負來判定日期的先後


From:http://tw.wingwit.com/Article/program/SQLServer/201311/22332.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.