SQL Server發展至今,關於日期的格式的控制方法,有傳統的方法,比如CONVERT(),也有比較便利的新方法,比如FORMAT();同樣,關於日期的操作函數,也分為傳統方法:DATEADD()等,也有便利的新方法:EOMonth()等。
一,日期的格式化
格式化是指把日期類型(Date)、日期和時間類型轉化為字符類型,通常使用CONVERT()和FORMAT()函數。
1,傳統的CONVERT()
SQL Server控制日期的的顯示格式,通常使用CONVERT()函數,通過控制style參數來控制日期顯示的格式,但是,style很多,不利於記憶。
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
符合東方人閱讀習慣的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()函數的style是數字,記憶起來比較困難,並且只能按照系統定義的格式來顯示,不夠靈活。SQL Server提供更為靈活的轉換函數FORMAT()。
2,便利的FORMAT()函數
FORMAT()函數,可以方便和靈活地控制數值、日期和時間類型的顯示格式,通常情況下,FORMAT()函數主要用於格式化顯示date/time類型和數值類型,參數format用於指定顯示的格式,給予用戶對格式更自由地控制,culture參數是可選的,用於指定顯示的語言,該函數返回值的數據類型是NVARCHAR,如果格式轉換失敗,該函數返回NULL:
FORMAT ( value, format [, culture ] )
參數format使用#表示一個數值,參數 format 使用以下占位符來表示日期/時間的格式:
- yyyy、MM、dd:表示年、月、日
- hh:mm:ss fffffff:表示時、分、秒、毫秒
- 使用“/”,“-”等作為連接各個部分(part)的分割符號
(1)把date/time格式化
在format參數中指定日期/時間顯示的格式,以特定的格式: “yyyy:MMdd hh:mm:ss fffffff” 顯式日期/時間,例如:
select format(SYSDATETIME(),'yyyy-MM-dd hh:mm:ss fffffff')
(2)轉換數值類型
在參數format中使用#代表一個數字,使用相應的連接符,拼接成數字的格式字符,例如:
FORMAT(123456789,'###-##-####') AS 'Custom Number Result
二,日期和時間的結構
常用的日期的構成(datepart)是:year、month、day、hour、minute、second、ns、TZoffset(簡寫為 tz)
DATEPART ( datepart , date ) YEAR ( date ) MONTH ( date ) DAY ( date )
在實際的產品環境中,周、季度等都很有用途:
- quarter:季度,取值范圍是 1、2、3、4
- week:周在年中的序數,取值范圍是 1 - 53
- dayofyear:天在年中的序數,取值范圍是 1 - 366
- weekday:天在一周中的序數,取值范圍是 1 - 7
DATEPART()返回的datepart是int類型,如果想要返回字符類型,可以使用DATENAME()函數:
DATENAME ( datepart , date )
通過datepart來構造日期,常用的函數有:
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 )
參數precision 是指小數秒的精度,指的是DateTime2(n)、DateTimeOffset(n),Time(n)中的n值,表示以多少位小數表示1s。
三,日期操作
日期函數:EOMonth、Format、DateAdd、DateDiff、SwitchOffset
1,月份的最后一天
函數 EOMonth() 返回指定日期的最后一天
EOMONTH ( start_date [, month_to_add ] )
參數注釋:
- start_date: 有兩種輸入方式,能夠轉換為Date的字符串類型 和 date 數據類型
- month_to_add: 是int 類型,能夠為正整數,負整數和0,默認值是0,如果省略,那么使用默認值0。
例如,查看當前月的最后一天、下一個月的最后一天、上一個月的最后一天:
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() 函數,能夠從3個正整數(year,month,day)中獲取date 類型,只需要將day 參數設置1,就能獲取月份的第一天的日期。
declare @date date set @date=getdate() select DATEFROMPARTS(year(@date),month(@date),1)
也可以使用Format() 函數, 以字符串形式返回月份的第一天,例如,獲取當前月份的第一天:
FORMAT(GETDATE(),'yyyyMM01')
3,切換時區
把DateTimeOffset類型的數據切換到指定的時區,在轉換過程中,UTC時間是固定的,依據固定的UTC時間,切換到特定時區的本地時間:
SWITCHOFFSET ( DATETIMEOFFSET, time_zone )
參數注釋:
- DATETIMEOFFSET:DateTimeOffset(n)類型的變量
- time_zone:指定的目標時區數據,格式是 [+|-] hh:mm
使用SwitchOffset()函數把DateTimeOffset的時區偏移(Offset)切換到指定的時區中,例如,把本地時間的時區東八區切換到東七區:
DECLARE @remote DATETIMEOFFSET DECLARE @local DATETIMEOFFSET SET @local = SYSDATETIMEOFFSET() SET @remote = SWITCHOFFSET (@local, '+07:00') SELECT @remote AS remote_time,@local AS local_time
可以看到,東7區的時間比東8區的時間晚一個小時。
4,當前日期是周幾
在SQL Server中,通過DataFirst選項設置一周的第一天,序數是從1到7,表示一周的7天。
SET DATEFIRST { number | @number_var }
(1)可以通過@@datefirst來獲取設置的值
set DATEFIRST 1 select @@datefirst
(2)使用函數datepart函數獲取當天是周幾
set DATEFIRST 1 select datepart(WEEKDAY,getutcdate()) set DATEFIRST 2 --select @@datefirst select datepart(WEEKDAY,getutcdate())
由於設置不同的DateFirst,會導致datepart返回不同的數值,所以必須借助@@DateFirst
set DATEFIRST 2 select Datepart(weekday, getdate()+@@datefirst - 1) set DATEFIRST 1 select Datepart(weekday, getdate()+@@datefirst - 1)
4,使用DateName獲取WeekDay的名字
WeekDay的名字跟系統的語言設置有管,跟DateFirst的設置沒有關系
(1) 查看當前的語言設置
select @@language
(2) 查看系統支持的語言
select alias,name, * from sys.syslanguages
(3) 設置語言
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())
參考文檔: