SQL Server 日期格式和日期操做

SQL Server發展至今,關於日期的格式的控制方法,有傳統的方法,好比CONVERT(),也有比較便利的新方法,好比FORMAT();一樣,關於日期的操做函數,也分爲傳統方法:DATEADD()等,也有便利的新方法:EOMonth()等。sql

一,日期的格式化

格式化是指把日期類型(Date)、日期和時間類型轉化爲字符類型,一般使用CONVERT()和FORMAT()函數。express

1,傳統的CONVERT()函數

SQL Server控制日期的的顯示格式,一般使用CONVERT()函數,經過控制style參數來控制日期顯示的格式,可是,style不少,不利於記憶。spa

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

符合東方人閱讀習慣的style及其顯示格式以下:code

  • 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()。orm

2,便利的FORMAT()函數server

FORMAT()函數,能夠方便和靈活地控制數值、日期和時間類型的顯示格式,一般狀況下,FORMAT()函數主要用於格式化顯示date/time類型和數值類型,參數format用於指定顯示的格式,給予用戶對格式更自由地控制,culture參數是可選的,用於指定顯示的語言,該函數返回值的數據類型是NVARCHAR,若是格式轉換失敗,該函數返回NULL:blog

FORMAT ( value, format [, culture ] ) 

參數format使用#表示一個數值,參數 format 使用如下佔位符來表示日期/時間的格式:ci

  • yyyy、MM、dd:表示年、月、日
  • hh:mm:ss fffffff:表示時、分、秒、毫秒
  • 使用「/」,「-」等做爲鏈接各個部分(part)的分割符號

(1)把date/time格式化rem

在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:季度,取值範圍是 一、二、三、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())

 

參考文檔:

Date and Time Data Types and Functions (Transact-SQL)

相關文章
相關標籤/搜索