天天看點

SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作

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')
           
SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作

(2)轉換數值類型

在參數format中使用#代表一個數字,使用相應的連接配接符,拼接成數字的格式字元,例如:

FORMAT(123456789,'###-##-####') AS 'Custom Number Result
           
SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作

二,日期和時間的結構

常用的日期的構成(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。

例如,檢視目前月的最後一天、下一個月的最後一天、上一個月的最後一天:

SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作
declare @date date
set @date=getdate()

select EOMONTH(@date) as CurrentMonth_EndDay,
    EOMONTH(@date,1) as NextMonth_EndDay,
    EOMONTH(@date,-1) as LastMonth_EndDay
           
SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作

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
           
SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作

可以看到,東7區的時間比東8區的時間晚一個小時。

4,目前日期是周幾

在SQL Server中,通過DataFirst選項設定一周的第一天,序數是從1到7,表示一周的7天。

SET DATEFIRST { number | @number_var }
           

(1)可以通過@@datefirst來擷取設定的值

set DATEFIRST 1
select @@datefirst
           

(2)使用函數datepart函數擷取當天是周幾

SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作
set DATEFIRST 1
select datepart(WEEKDAY,getutcdate())

set DATEFIRST 2
--select @@datefirst
select datepart(WEEKDAY,getutcdate())
           
SQL中的cast 和convert的差別,日期操作SQL Server 日期格式和日期操作

由于設定不同的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