目錄
- 一,日期的格式化
- 二,日期和時(shí)間的結(jié)構(gòu)
- 三,日期操作
- 四. 日期函數(shù)
SQL Server發(fā)展至今,關(guān)于日期的格式的控制方法,有傳統(tǒng)的方法,比如CONVERT(),也有比較便利的新方法,比如FORMAT();同樣,關(guān)于日期的操作函數(shù),也分為傳統(tǒng)方法:DATEADD()等,也有便利的新方法:EOMonth()等。
一,日期的格式化
格式化是指把日期類型(Date)、日期和時(shí)間類型轉(zhuǎn)化為字符類型,通常使用CONVERT()和FORMAT()函數(shù)。
1,傳統(tǒng)的CONVERT()
SQL Server控制日期的的顯示格式,通常使用CONVERT()函數(shù),通過控制style參數(shù)來控制日期顯示的格式,但是,style很多,不利于記憶。
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
符合東方人閱讀習(xí)慣的style及其顯示格式如下:
- 101: mm/dd/yyyy
- 110: mm-dd-yyyy
- 111: yyyy/mm/dd
- 112: yyyymmdd
- 120: yyyy-mm-dd hh:mm:ss
- 121: yyyy-mm-dd hh:mm:sssssss
CONVERT()函數(shù)的style是數(shù)字,記憶起來比較困難,并且只能按照系統(tǒng)定義的格式來顯示,不夠靈活。SQL Server提供更為靈活的轉(zhuǎn)換函數(shù)FORMAT()。
2,便利的FORMAT()函數(shù)
FORMAT()函數(shù),可以方便和靈活地控制數(shù)值、日期和時(shí)間類型的顯示格式,通常情況下,F(xiàn)ORMAT()函數(shù)主要用于格式化顯示date/time類型和數(shù)值類型,參數(shù)format用于指定顯示的格式,給予用戶對(duì)格式更自由地控制,culture參數(shù)是可選的,用于指定顯示的語言,該函數(shù)返回值的數(shù)據(jù)類型是NVARCHAR,如果格式轉(zhuǎn)換失敗,該函數(shù)返回NULL:
FORMAT ( value, format [, culture ] )
參數(shù)format使用#表示一個(gè)數(shù)值,參數(shù) format 使用以下占位符來表示日期/時(shí)間的格式:
- yyyy、MM、dd:表示年、月、日
- hh:mm:ss fffffff:表示時(shí)、分、秒、毫秒
- 使用“/”,“-”等作為連接各個(gè)部分(part)的分割符號(hào)
(1)把date/time格式化
在format參數(shù)中指定日期/時(shí)間顯示的格式,以特定的格式: “yyyy:MMdd hh:mm:ss fffffff” 顯式日期/時(shí)間,例如:
select format(SYSDATETIME(),'yyyy-MM-dd hh:mm:ss fffffff')
![](/d/20211017/7ec847c1566f9a954cfedd8536cd40f9.gif)
(2)轉(zhuǎn)換數(shù)值類型
在參數(shù)format中使用#代表一個(gè)數(shù)字,使用相應(yīng)的連接符,拼接成數(shù)字的格式字符,例如:
FORMAT(123456789,'###-##-####') AS 'Custom Number Result
![](/d/20211017/9676f1b2f0a8dd36d8e95c4006598cf8.gif)
二,日期和時(shí)間的結(jié)構(gòu)
常用的日期的構(gòu)成(datepart)是:year、month、day、hour、minute、second、ns、TZoffset(簡(jiǎn)寫為 tz)
DATEPART ( datepart , date )
YEAR ( date )
MONTH ( date )
DAY ( date )
在實(shí)際的產(chǎn)品環(huán)境中,周、季度等都很有用途:
- quarter:季度,取值范圍是 1、2、3、4
- week:周在年中的序數(shù),取值范圍是 1 - 53
- dayofyear:天在年中的序數(shù),取值范圍是 1 - 366
- weekday:天在一周中的序數(shù),取值范圍是 1 - 7
DATEPART()返回的datepart是int類型,如果想要返回字符類型,可以使用DATENAME()函數(shù):
DATENAME ( datepart , date )
通過datepart來構(gòu)造日期,常用的函數(shù)有:
DATEFROMPARTS ( year, month, day )
DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision )
DATETIMEOFFSETFROMPARTS ( year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset, precision )
TIMEFROMPARTS ( hour, minute, seconds, fractions, precision )
參數(shù)precision 是指小數(shù)秒的精度,指的是DateTime2(n)、DateTimeOffset(n),Time(n)中的n值,表示以多少位小數(shù)表示1s。
三,日期操作
日期函數(shù):EOMonth、Format、DateAdd、DateDiff、SwitchOffset
1,月份的最后一天
函數(shù) EOMonth() 返回指定日期的最后一天
EOMONTH ( start_date [, month_to_add ] )
參數(shù)注釋:
- start_date: 有兩種輸入方式,能夠轉(zhuǎn)換為Date的字符串類型 和 date 數(shù)據(jù)類型
- month_to_add: 是int 類型,能夠?yàn)檎麛?shù),負(fù)整數(shù)和0,默認(rèn)值是0,如果省略,那么使用默認(rèn)值0。
例如,查看當(dāng)前月的最后一天、下一個(gè)月的最后一天、上一個(gè)月的最后一天:
declare @date date
set @date=getdate()
select EOMONTH(@date) as CurrentMonth_EndDay,
EOMONTH(@date,1) as NextMonth_EndDay,
EOMONTH(@date,-1) as LastMonth_EndDay
2,月份的第一天
使用DateFromParts() 函數(shù),能夠從3個(gè)正整數(shù)(year,month,day)中獲取date 類型,只需要將day 參數(shù)設(shè)置1,就能獲取月份的第一天的日期。
declare @date date
set @date=getdate()
select DATEFROMPARTS(year(@date),month(@date),1)
也可以使用Format() 函數(shù), 以字符串形式返回月份的第一天,例如,獲取當(dāng)前月份的第一天:
FORMAT(GETDATE(),'yyyyMM01')
3,切換時(shí)區(qū)
把DateTimeOffset類型的數(shù)據(jù)切換到指定的時(shí)區(qū),在轉(zhuǎn)換過程中,UTC時(shí)間是固定的,依據(jù)固定的UTC時(shí)間,切換到特定時(shí)區(qū)的本地時(shí)間:
SWITCHOFFSET ( DATETIMEOFFSET, time_zone )
參數(shù)注釋:
- DATETIMEOFFSET:DateTimeOffset(n)類型的變量
- time_zone:指定的目標(biāo)時(shí)區(qū)數(shù)據(jù),格式是 [+|-] hh:mm
使用SwitchOffset()函數(shù)把DateTimeOffset的時(shí)區(qū)偏移(Offset)切換到指定的時(shí)區(qū)中,例如,把本地時(shí)間的時(shí)區(qū)東八區(qū)切換到東七區(qū):
DECLARE @remote DATETIMEOFFSET
DECLARE @local DATETIMEOFFSET
SET @local = SYSDATETIMEOFFSET()
SET @remote = SWITCHOFFSET (@local, '+07:00')
SELECT @remote AS remote_time,@local AS local_time
![](/d/20211017/621624cc2b09854c5c1b0a5cdda25dc1.gif)
可以看到,東7區(qū)的時(shí)間比東8區(qū)的時(shí)間晚一個(gè)小時(shí)。
4,當(dāng)前日期是周幾
在SQL Server中,通過DataFirst選項(xiàng)設(shè)置一周的第一天,序數(shù)是從1到7,表示一周的7天。
SET DATEFIRST { number | @number_var }
(1)可以通過@@datefirst來獲取設(shè)置的值
set DATEFIRST 1
select @@datefirst
(2)使用函數(shù)datepart函數(shù)獲取當(dāng)天是周幾
set DATEFIRST 1
select datepart(WEEKDAY,getutcdate())
set DATEFIRST 2
--select @@datefirst
select datepart(WEEKDAY,getutcdate())
由于設(shè)置不同的DateFirst,會(huì)導(dǎo)致datepart返回不同的數(shù)值,所以必須借助@@DateFirst
set DATEFIRST 2
select Datepart(weekday, getdate()+@@datefirst - 1)
set DATEFIRST 1
select Datepart(weekday, getdate()+@@datefirst - 1)
4,使用DateName獲取WeekDay的名字
WeekDay的名字跟系統(tǒng)的語言設(shè)置有管,跟DateFirst的設(shè)置沒有關(guān)系
(1) 查看當(dāng)前的語言設(shè)置
(2) 查看系統(tǒng)支持的語言
select alias,name, *
from sys.syslanguages
(3) 設(shè)置語言
set LANGUAGE 'Simplified Chinese'
set LANGUAGE 'us_english'
(4) 使用DateName獲取WeekDay的名字
set LANGUAGE 'Simplified Chinese'
select DATENAME(WEEKDAY,getutcdate())
set LANGUAGE 'us_english'
select DATENAME(WEEKDAY,getutcdate())
四. 日期函數(shù)
sqlserver_時(shí)間格式化_年月日
函數(shù)名稱 參數(shù) 示例 說明
dateadd(日期部分,數(shù)字,日期)
select dateadd(year,45,'1990-12-11') 返回 2035-12-11 00:00:00.000
select dateadd(month,45,'1990-12-11') 返回 1994-09-11 00:00:00.000
select dateadd(mm,45,'1990-12-11') 返回 1994-09-11 00:00:00.000
select dateadd(qq,12,'1990-12-11') 返回 1993-12-11 00:00:00.000
select dateadd(hh,12,'1990-12-11') 返回 1990-12-11 12:00:00.000
select dateadd(yy,-12,'1990-12-11') 返回 1978-12-11 00:00:00.000
返回給指定日期加上一個(gè)時(shí)間間隔后的新的日期值。
數(shù)字:用于與指定的日期部分相加的值。如果指定了非整數(shù)值,則將舍棄該值的小數(shù)部分,舍棄時(shí)不遵循四舍五入。
日期:指定的原日期
在此函數(shù)中 :dw,dy,dd 效果一樣都表示天
datediff(日期部分,開始日期,結(jié)束日期)
select datediff(yy,'1990-12-11','2008-9-10') 返回 18
selectdatediff(mm,'2007-12-11','2008-9-10') 返回 9
返回兩個(gè)指定日期的指定日期部分的差的整數(shù)值。
在此函數(shù)中dw,dy,dd 效果一樣都表示天
datename(日期部分,日期)
select datename(mm,'2007-12-11') 返回 12
select datename(dw,'2007-12-11') 返回星期二
select datename(dd, ‘2007-12-11') 返回 11
select datename(wk, ‘2007-12-11') – 50 一年中的第幾個(gè)星期
select datename(dy, ‘2007-12-11') – 345 一年中的第幾天
select DATENAME(YYYY,GETDATE()) + DATENAME(MM,GETDATE()) – 201803
返回表示指定日期的指定日期部分的字符串。
dw 表示一星期中星期幾
wk 表示一年中的第幾個(gè)星期
dy 表示一年中的第幾天
datepart(日期部分,日期)
select datepart(mm,'2007-12-11')返回 12
select datepart(dw,'2007-12-11')返回 3
select datepart(dd, ‘2007-12-11')返回 11
select DATEPART(YYYY,GETDATE()) + DATENAME(MM,GETDATE()) – 2021
返回表示指定日期的指定日期部分的整數(shù)。
wk 表示一年中的第幾個(gè)星期
dy 表示一年中的第幾天,
dw 表示一星期中星期幾,返回整數(shù)默認(rèn) 1 為星期天
getdate()無參數(shù)
select getdate() 返回 2222-02-22 12:34:19.070
返回當(dāng)前系統(tǒng)日期和時(shí)間。
getutcdate()無參數(shù)
select getutcdate() 返回2222-02-22 04:34:19.073
返回表示當(dāng)前的UTC(世界標(biāo)準(zhǔn)時(shí)間)時(shí)間。即格林尼治時(shí)間(GMT)
1、上月的第一天
SELECT CONVERT(CHAR(10),DATEADD(month,-1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111)
2、上月的最后一天
SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()),0)),111)+' 23:59:59'
3、本月的第一天
SELECT CONVERT(CHAR(10),DATEADD(dd,-DAY(GETDATE())+1,GETDATE()),111)
4、本月的最后一天
SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0)),111)+' 23:59:59'
5、來月的最后第一天
SELECT CONVERT(CHAR(10),DATEADD(m,1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111)
6、來月的最后一天
SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+2,0)),111)+' 23:59:59'
日期部分 含義 :
縮寫year年yy,yyyy
quarter季qq,q
month月mm, m
dayofyear天(請(qǐng)看函數(shù)中的說明)dy, y
day天(請(qǐng)看函數(shù)中的說明)dd, d
week星期wk, ww
weekday天(請(qǐng)看函數(shù)中的說明)dw, w
hour小時(shí)hh
minute分鐘mi, n
second秒ss, s
millisecond毫秒ms
==================================================
Sql Server 查詢指定范圍(一周,一月,本周,本月等)內(nèi)的數(shù)據(jù)
1.查詢今日的所有數(shù)據(jù)
select * from 表名 where datediff(day,字段名,getdate())=0
2.查詢昨日的所有數(shù)據(jù)
select * from 表名 where datediff(day,字段名,getdate()-1)=0
3.查詢當(dāng)天日期在一周前的數(shù)據(jù)
selcet * from 表名 where datediff(week,字段名,getdate()-1)=0
4.查詢前30天的數(shù)據(jù)
select * from 表名 where datediff(d,字段名,getdate())=30
5.查詢上一個(gè)月的數(shù)據(jù)
select * from 表名 where datediff(m,字段名,getdate())=1
6.查詢當(dāng)天的數(shù)據(jù)
select * from 表名 where datediff(dd,字段名,getdate())=0
7.查詢24小時(shí)內(nèi)的數(shù)據(jù)
select * from 表名 where datediff(hh,字段名,getdate())
8.查詢本周的數(shù)據(jù)
select * from 表名 where datediff(week,字段名,getdate())=0
9.查詢本月的數(shù)據(jù)
select * from 表名 where datediff(month,字段名,getdate())=0
10.查詢本季的數(shù)據(jù)
select * from 表名 where datediff(qq,字段名,getdate())=0
到此這篇關(guān)于SQLServer日期函數(shù)總結(jié)案例詳解的文章就介紹到這了,更多相關(guān)SQLServer日期函數(shù)總結(jié)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- SQLServer 日期函數(shù)大全(小結(jié))
- SQLserver中用convert函數(shù)轉(zhuǎn)換日期格式的方法
- SqlServer中的日期與時(shí)間函數(shù)
- Sqlserver 常用日期時(shí)間函數(shù)