談值得收藏的SQL時(shí)間函數(shù)_Mssql數(shù)據(jù)庫(kù)教程
推薦:怎樣從多個(gè)位置截取字符串的SQL語(yǔ)句知:字段A=’F:\photo\WinterLeaves.jpg’ 要求:分段截取每段字符[字段A不能為T(mén)EXT類(lèi)型,否則報(bào)錯(cuò)] 解決方法: ---截取字符串A的第一個(gè)\左邊的字符串 selectleft(A,charindex(’/’,A)-1) 輸出結(jié)果:F: ---截取\中間的字符串 selectleft(stuff(A,1,charindex(’/
--日期轉(zhuǎn)換參數(shù)
select CONVERT(varchar, getdate(), 120 )2004-09-12 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')20040912110608
select CONVERT(varchar(12) , getdate(), 111 )2004/09/12
select CONVERT(varchar(12) , getdate(), 112 )20040912
select CONVERT(varchar(12) , getdate(), 102 )2004.09.12
其它我不常用的日期格式轉(zhuǎn)換方法:
select CONVERT(varchar(12) , getdate(), 101 )09/12/2004
select CONVERT(varchar(12) , getdate(), 103 )12/09/2004
select CONVERT(varchar(12) , getdate(), 104 )12.09.2004
select CONVERT(varchar(12) , getdate(), 105 )12-09-2004
select CONVERT(varchar(12) , getdate(), 106 )12 09 2004
select CONVERT(varchar(12) , getdate(), 107 )09 12, 2004
select CONVERT(varchar(12) , getdate(), 108 )11:06:08
select CONVERT(varchar(12) , getdate(), 109 )09 12 2004 1
select CONVERT(varchar(12) , getdate(), 110 )09-12-2004
select CONVERT(varchar(12) , getdate(), 113 )12 09 2004 1
select CONVERT(varchar(12) , getdate(), 114 )11:06:08.177
1. 當(dāng)前系統(tǒng)日期、時(shí)間
select getdate()
2. dateadd 在向指定日期加上一段時(shí)間的基礎(chǔ)上,返回新的 datetime 值
例如:向日期加上2天
select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000
3. datediff 返回跨兩個(gè)指定日期的日期和時(shí)間邊界數(shù)。
select datediff(day,'2004-09-01','2004-09-18') --返回:17
4. datepart 返回代表指定日期的指定日期部分的整數(shù)。
SELECT DATEPART(month, '2004-10-15') --返回 10
5. datename 返回代表指定日期的指定日期部分的字符串
SELECT datename(weekday, '2004-10-15') --返回:星期五
6. day(), month(),year() --可以與datepart對(duì)照一下
select 當(dāng)前日期=convert(varchar(10),getdate(),120)
,當(dāng)前時(shí)間=convert(varchar(8),getdate(),114)
select datename(dw,'2004-10-15')
select 本年第多少周=datename(week,'2004-10-15')
,今天是周幾=datename(weekday,'2004-10-15')
函數(shù) 參數(shù)/功能
GetDate( ) 返回系統(tǒng)目前的日期與時(shí)間
DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 與date1兩個(gè)日期之間的差值
date2-date1
DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期
DatePart (interval,date) 返回日期date中,interval指定部分所對(duì)應(yīng)的整數(shù)值
DateName (interval,date) 返回日期date中,interval指定部分所對(duì)應(yīng)的字符串名稱(chēng)
參數(shù) interval的設(shè)定值如下:
值 縮 寫(xiě)(Sql Server) Access 和 ASP 說(shuō)明
Year Yy yyyy 年 1753 ~ 9999
Quarter Qq q 季 1 ~ 4
Month Mm m 月1 ~ 12
Day of year Dy y 一年的日數(shù),一年中的第幾日 1-366
Day Dd d 日,1-31
Weekday Dw w 一周的日數(shù),一周中的第幾日 1-7
Week Wk ww 周,一年中的第幾周 0 ~ 51
Hour Hh h 時(shí)0 ~ 23
Minute Mi n 分鐘0 ~ 59
Second Ss s 秒 0 ~ 59
Millisecond Ms - 毫秒 0 ~ 999
access 和 asp 中用date()和now()取得系統(tǒng)日期時(shí)間;其中DateDiff,DateAdd,DatePart也同是能用于
Access和asp中,這些函數(shù)的用法也類(lèi)似
舉例:
1.GetDate() 用于sql server :select GetDate()
2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')返回值為 514592 秒
DateDiff('d','2005-07-20','2005-7-25 22:56:32')返回值為 5 天
3.DatePart('w','2005-7-25 22:56:32')返回值為 2 即星期一(周日為1,周六為7)
DatePart('d','2005-7-25 22:56:32')返回值為 25即25號(hào)
DatePart('y','2005-7-25 22:56:32')返回值為 206即這一年中第206天
DatePart('yyyy','2005-7-25 22:56:32')返回值為 2005即2005年
SQL Server DATEPART() 函數(shù)返回 SQLServer datetime 字段的一部分。
SQL Server DATEPART() 函數(shù)的語(yǔ)法是:
DATEPART(portion, datetime)
其中 datetime 是 SQLServer datetime 字段和部分的名稱(chēng)是下列之一: Ms for Milliseconds
Yy for Year
Qq for Quarter of the Year
Mm for Month
Dy for the Day of the Year
Dd for Day of the Month
Wk for Week
Dw for the Day of the Week
Hh for Hour
Mi for Minute
Ss for Second
詳細(xì)的說(shuō)明:
通常,你需要獲得當(dāng)前日期和計(jì)算一些其他的日期,例如,你的程序可能需要判斷一個(gè)月的第一天或者最
后一天。你們大部分人大概都知道怎樣把日期進(jìn)行分割(年、月、日等),然后僅僅用分割出來(lái)的年、月
、日等放在幾個(gè)函數(shù)中計(jì)算出自己所需要的日期!在這篇文章里,我將告訴你如何使用DATEADD和
DATEDIFF函數(shù)來(lái)計(jì)算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必須注意以下的問(wèn)題。大部分可能不是所有例子在不同的機(jī)器上執(zhí)行的結(jié)果
可能不一樣,這完全由哪一天是一個(gè)星期的第一天這個(gè)設(shè)置決定。第一天(DATEFIRST)設(shè)定決定了你的
系統(tǒng)使用哪一天作為一周的第一天。所有以下的例子都是以星期天作為一周的第一天來(lái)建立,也就是第一
天設(shè)置為7。假如你的第一天設(shè)置不一樣,你可能需要調(diào)整這些例子,使它和不同的第一天設(shè)置相符合。
你可以通過(guò)@@DATEFIRST函數(shù)來(lái)檢查第一天設(shè)置。
為了理解這些例子,我們先復(fù)習(xí)一下DATEDIFF和DATEADD函數(shù)。DATEDIFF函數(shù)計(jì)算兩個(gè)日期之間的小時(shí)、
天、周、月、年等時(shí)間間隔總數(shù)。DATEADD函數(shù)計(jì)算一個(gè)日期通過(guò)給時(shí)間間隔加減來(lái)獲得一個(gè)新的日期。
要了解更多的DATEDIFF和DATEADD函數(shù)以及時(shí)間間隔可以閱讀微軟聯(lián)機(jī)幫助。
使用DATEDIFF和DATEADD函數(shù)來(lái)計(jì)算日期,和本來(lái)從當(dāng)前日期轉(zhuǎn)換到你需要的日期的考慮方法有點(diǎn)不同。
你必須從時(shí)間間隔這個(gè)方面來(lái)考慮。比如,從當(dāng)前日期到你要得到的日期之間有多少時(shí)間間隔,或者,從
今天到某一天(比如1900-1-1)之間有多少時(shí)間間隔,等等。理解怎樣著眼于時(shí)間間隔有助于你輕松的理
解我的不同的日期計(jì)算例子。
一個(gè)月的第一天
第一個(gè)例子,我將告訴你如何從當(dāng)前日期去這個(gè)月的最后一天。請(qǐng)注意:這個(gè)例子以及這篇文章中的其他
例子都將只使用DATEDIFF和DATEADD函數(shù)來(lái)計(jì)算我們想要的日期。每一個(gè)例子都將通過(guò)計(jì)算但前的時(shí)間間
隔,然后進(jìn)行加減來(lái)得到想要計(jì)算的日期。
這是計(jì)算一個(gè)月第一天的SQL 腳本:
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
我們把這個(gè)語(yǔ)句分開(kāi)來(lái)看看它是如何工作的。最核心的函數(shù)是getdate(),大部分人都知道這個(gè)是返回當(dāng)
前的日期和時(shí)間的函數(shù)。下一個(gè)執(zhí)行的函數(shù)DATEDIFF(mm,0,getdate())是計(jì)算當(dāng)前日期和“1900-01-01
00:00:00.000”這個(gè)日期之間的月數(shù)。記住:時(shí)期和時(shí)間變量和毫秒一樣是從“1900-01-01 00:00:00.000”
開(kāi)始計(jì)算的。這就是為什么你可以在DATEDIFF函數(shù)中指定第一個(gè)時(shí)間表達(dá)式為“0”。下一個(gè)函數(shù)是DATEADD
,增加當(dāng)前日期到“1900-01-01”的月數(shù)。通過(guò)增加預(yù)定義的日期“1900-01-01”和當(dāng)前日期的月數(shù),我們可
以獲得這個(gè)月的第一天。另外,計(jì)算出來(lái)的日期的時(shí)間部分將會(huì)是“00:00:00.000”。
這個(gè)計(jì)算的技巧是先計(jì)算當(dāng)前日期到“1900-01-01”的時(shí)間間隔數(shù),然后把它加到“1900-01-01”上來(lái)獲得特
殊的日期,這個(gè)技巧可以用來(lái)計(jì)算很多不同的日期。下一個(gè)例子也是用這個(gè)技巧從當(dāng)前日期來(lái)產(chǎn)生不同的
日期。
本周的星期一
這里我是用周(wk)的時(shí)間間隔來(lái)計(jì)算哪一天是本周的星期一。
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
一年的第一天
現(xiàn)在用年(yy)的時(shí)間間隔來(lái)顯示這一年的第一天。
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
季度的第一天
假如你要計(jì)算這個(gè)季度的第一天,這個(gè)例子告訴你該如何做。
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
當(dāng)天的半夜
曾經(jīng)需要通過(guò)getdate()函數(shù)為了返回時(shí)間值截掉時(shí)間部分,就會(huì)考慮到當(dāng)前日期是不是在半夜。假如這
樣,這個(gè)例子使用DATEDIFF和DATEADD函數(shù)來(lái)獲得半夜的時(shí)間點(diǎn)。
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
深入DATEDIFF和DATEADD函數(shù)計(jì)算
你可以明白,通過(guò)使用簡(jiǎn)單的DATEDIFF和DATEADD函數(shù)計(jì)算,你可以發(fā)現(xiàn)很多不同的可能有意義的日期。
目前為止的所有例子只是僅僅計(jì)算當(dāng)前的時(shí)間和“1900-01-01”之間的時(shí)間間隔數(shù)量,然后把它加到“1900
-01-01”的時(shí)間間隔上來(lái)計(jì)算出日期。假定你修改時(shí)間間隔的數(shù)量,或者使用不同的時(shí)間間隔來(lái)調(diào)用
DATEADD函數(shù),或者減去時(shí)間間隔而不是增加,那么通過(guò)這些小的調(diào)整你可以發(fā)現(xiàn)和多不同的日期。
這里有四個(gè)例子使用另外一個(gè)DATEADD函數(shù)來(lái)計(jì)算最后一天來(lái)分別替換DATEADD函數(shù)前后兩個(gè)時(shí)間間隔。
上個(gè)月的最后一天
這是一個(gè)計(jì)算上個(gè)月最后一天的例子。它通過(guò)從一個(gè)月的最后一天這個(gè)例子上減去3毫秒來(lái)獲得。有一點(diǎn)
要記住,在Sql Server中時(shí)間是精確到3毫秒。這就是為什么我需要減去3毫秒來(lái)獲得我要的日期和時(shí)間。
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
計(jì)算出來(lái)的日期的時(shí)間部分包含了一個(gè)Sql Server可以記錄的一天的最后時(shí)刻(“23:59:59:997”)的時(shí)間。
去年的最后一天
連接上面的例子,為了要得到去年的最后一天,你需要在今年的第一天上減去3毫秒。
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
本月的最后一天
現(xiàn)在,為了獲得本月的最后一天,我需要稍微修改一下獲得上個(gè)月的最后一天的語(yǔ)句。修改需要給用
DATEDIFF比較當(dāng)前日期和“1900-01-01”返回的時(shí)間間隔上加1。通過(guò)加1個(gè)月,我計(jì)算出下個(gè)月的第一天,
然后減去3毫秒,這樣就計(jì)算出了這個(gè)月的最后一天。這是計(jì)算本月最后一天的SQL腳本。
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
本年的最后一天
你現(xiàn)在應(yīng)該掌握這個(gè)的做法,這是計(jì)算本年最后一天腳本
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))
本月的第一個(gè)星期一
好了,現(xiàn)在是最后一個(gè)例子。這里我要計(jì)算這個(gè)月的第一個(gè)星期一。這是計(jì)算的腳本。
select DATEADD(wk, DATEDIFF(wk,0,
dateadd(dd,6-datepart(day,getdate()),getdate())), 0)
分享:淺析優(yōu)化SQL語(yǔ)句性能調(diào)整原則一、問(wèn)題的提出 在應(yīng)用系統(tǒng)開(kāi)發(fā)初期,由于開(kāi)發(fā)數(shù)據(jù)庫(kù)數(shù)據(jù)比較少,對(duì)于查詢(xún)SQL語(yǔ)句,復(fù)雜視圖的的編寫(xiě)等體會(huì)不出SQL語(yǔ)句各種寫(xiě)法的性能優(yōu)劣,但是如果將應(yīng)用系統(tǒng)提交實(shí)際應(yīng)用后,隨著數(shù)據(jù)庫(kù)中數(shù)據(jù)的增加,系統(tǒng)的響應(yīng)速度就成為目前系統(tǒng)需要解決的最主要的問(wèn)題
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無(wú)法查看數(shù)據(jù)庫(kù),提示 無(wú)法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類(lèi)似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過(guò)程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 解讀五種查詢(xún)數(shù)據(jù)庫(kù)中重復(fù)記錄的方法
- 解讀SQL語(yǔ)句經(jīng)驗(yàn)技巧
- 從Access數(shù)據(jù)庫(kù)到SQL Server高手
- 數(shù)據(jù)庫(kù)的分離及附加
- 用TableDiff產(chǎn)生SQL Server同步腳本
- 解析SqlServer2000獲取當(dāng)前日期及格式
- 詳解數(shù)據(jù)庫(kù)導(dǎo)出成excel的sql語(yǔ)句
- 怎樣用SQL Server事件探查器創(chuàng)建跟蹤
- 數(shù)據(jù)庫(kù)中兩張表之間的數(shù)據(jù)同步增加、刪除與更新實(shí)現(xiàn)思路
- 解析SQL 2000和Sql 2005如何相互轉(zhuǎn)換
猜你也喜歡看這些
- MySQL的安全問(wèn)題從安裝開(kāi)始說(shuō)起
- Mysql中“Insert into xxx on duplicate key update”問(wèn)題
- 解析csv數(shù)據(jù)導(dǎo)入mysql的方法
- 總結(jié)MySQL建表、查詢(xún)優(yōu)化的一些實(shí)用小技巧
- 通過(guò)mysqladmin遠(yuǎn)程管理mysql的方法
- MySQL數(shù)據(jù)庫(kù)INNODB 表?yè)p壞修復(fù)過(guò)程
- Mysql中文亂碼以及導(dǎo)出為sql語(yǔ)句和Excel問(wèn)題解決方法[圖文]
- mysql 定時(shí)更新表字段列的值狀態(tài)
- 遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù)注意點(diǎn)記錄
- SQLServer導(dǎo)出數(shù)據(jù)到MySQL實(shí)例介紹
- 相關(guān)鏈接:
- 教程說(shuō)明:
Mssql數(shù)據(jù)庫(kù)教程-談值得收藏的SQL時(shí)間函數(shù)
。