SQL Server 日期格式和日期操作
SQL Server發展至今,
1、關于日期的格式的控制方法,
有傳統的方法,比如CONVERT(),
也有比較便利的新方法,比如FORMAT(); eg: FORMAT(CAST(date AS DATE),'yyyy-MM') ps:年要用小寫的yyyy, 月大寫MM
2、同樣,關于日期的操作函數,也分為傳統方法: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()[email protected]@datefirst - 1)
set DATEFIRST 1
select Datepart(weekday, getdate()[email protected]@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())
--------------------------------------------------------------------------------------------------------------------------------
本文導讀:SQL中的cast 和convert都是用來将一種資料類型的表達式轉換為另一種資料類型的表達式。CAST 和 CONVERT 提供相似的功能,隻是文法不同。在時間轉化中一般用到convert,因為它比cast多加了一個style,可以轉化成不同時間的格式。
一、文法:
1、使用 CAST
CAST ( expression AS data_type )
2、使用 CONVERT
CONVERT (data_type[(length)], expression [, style])
3、參數說明
expression
是任何有效的表達式。
data_type:
目标系統所提供的資料類型,包括 bigint 和 sql_variant。不能使用使用者定義的資料類型。
length
nchar、nvarchar、char、varchar、binary 或 varbinary 資料類型的可選參數。
style
日期格式樣式,借以将 datetime 或 smalldatetime 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料類型);或者字元串格式樣式,借以将 float、real、money 或 smallmoney 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料類型)。
二、cast和convert的代碼示例
SQL 代碼 複制
select CAST('123' as int) -- 123
select CONVERT(int, '123') -- 123
select CAST(123.4 as int) -- 123
select CONVERT(int, 123.4) -- 123
select CAST('123.4' as int)
select CONVERT(int, '123.4')
-- Conversion failed when converting the varchar value '123.4' to data type int.
select CAST('123.4' as decimal) -- 123
select CONVERT(decimal, '123.4') -- 123
select CAST('123.4' as decimal(9,2)) -- 123.40
select CONVERT(decimal(9,2), '123.4') -- 123.40
declare @Num money
set @Num = 1234.56
select CONVERT(varchar(20), @Num, 0) -- 1234.56
select CONVERT(varchar(20), @Num, 1) -- 1,234.56
select CONVERT(varchar(20), @Num, 2) -- 1234.5600
三、convert函數的style參數說明
1、Date 和 Time 樣式
不帶世紀數位 (yy) | 帶世紀數位 (yyyy) | 輸入/輸出 |
- | 0 或 100 | mon dd yyyy hh:miAM(或 PM) |
1 | 101 | 1 = mm/dd/yy 101 = mm/dd/yyyy |
2 | 102 | 2 = yy.mm.dd 102 = yyyy.mm.dd |
3 | 103 | 3 = dd/mm/yy 103 = dd/mm/yyyy |
4 | 104 | 4 = dd.mm.yy 104 = dd.mm.yyyy |
5 | 105 | 5 = dd-mm-yy 105 = dd-mm-yyyy |
6 | 106 | 6 = dd mon yy 106 = dd mon yyyy |
7 | 107 | 7 = Mon dd, yy 107 = Mon dd, yyyy |
8 | 108 | hh:mi:ss |
- | 9 或 109 | mon dd yyyy hh:mi:ss:mmmAM(或 PM) |
10 | 110 | 10 = mm-dd-yy 110 = mm-dd-yyyy |
11 | 111 | 11 = yy/mm/dd 111 = yyyy/mm/dd |
12 | 112 | 12 = yymmdd 112 = yyyymmdd |
- | 13 或 113 | dd mon yyyy hh:mi:ss:mmm(24h) |
14 | 114 | dd mon yyyy hh:mi:ss:mmm(24h) |
- | 20 或 120 | yyyy-mm-dd hh:mi:ss(24h) |
- | 21 或 121 | yyyy-mm-dd hh:mi:ss.mmm(24h) |
- | 126 | yyyy-mm-ddThh:mi:ss.mmm(無空格) |
- | 127 | yyyy-mm-ddThh:mi:ss.mmmZ(無空格) |
- | 130 | dd mon yyyy hh:mi:ss:mmmAM |
- | 131 | dd/mm/yyyy hh:mi:ss:mmmAM |
2、float 和 real 樣式
值 | 輸出 |
0(預設值) | 最多包含 6 位。 根據需要使用科學記數法。 |
1 | 始終為 8 位值。 始終使用科學記數法。 |
2 | 始終為 16 位值。 始終使用科學記數法。 |
3、money 和 smallmoney 樣式
值 | 輸出 |
小數點左側每三位數字之間不以逗号分隔,小數點右側取兩位數,例如 4235.98。 | |
1 | 小數點左側每三位數字之間以逗号分隔,小數點右側取兩位數,例如 3,510.92。 |
2 | 小數點左側每三位數字之間以逗号分隔,小數點右側取兩位數,例如 3,510.92。 |
126 | 轉換為 char(n) 或 varchar(n) 時,等同于樣式 2 |