1. 程式人生 > 資料庫 >Sql Server的DateTime相關

Sql Server的DateTime相關

計錄,非原創

 

1.一個月第一天的
Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

2.本週的星期一
Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

3.一年的第一天
Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

4.季度的第一天
Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

5.當天的半夜
Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

6.上個月的最後一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))


7.去年的最後一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

8.本月的最後一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

9.本年的最後一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

10.本月的第一個星期一
select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

 

在本文中,GetDate()獲得的日期由兩部分組成,分別是今天的日期和當時的時間: Select GetDate()  用DateName()就可以獲得相應的年、月、日,然後再把它們連線起來就可以了:

Select Datename(year,GetDate())+'-'+Datename (month,GetDate())+'-'+Datename(day,GetDate())

另外,DateName()還可以獲得到小時、時間、秒、星期幾、第幾周,分別如下:

Select Datename(hour,GetDate()) Select Datename(minute,GetDate()) Select Datename(second,GetDate()) Select Datename(weekDay,GetDate()) Select Datename(week,GetDate())

SQL中的日期型別DateTime的預設格式就是yyyy-mm-dd hh:mi:ss: mmm,可大多數的情況我們只想得到他的日期部分,而不許要後面的時間。上一篇中提到用Datename()函式來擷取拼接出不包含時間部分的日期,現在再說一種方法,更加簡單的獲取到不包含時間的日期

Convert函式轉換字串

set nocount on;

      SELECT 'CONVERT(varchar(100), GETDATE(), 0)    'T_Sql,    CONVERT(varchar(100), GETDATE(), 0)     ConvertResult           --01 16 2021 11:16AM
union SELECT 'CONVERT(varchar(100), GETDATE(), 1)   ',        CONVERT(varchar(100), GETDATE(), 1)                         --01/16/21
union SELECT 'CONVERT(varchar(100), GETDATE(), 2)    ',        CONVERT(varchar(100), GETDATE(), 2)                           --01-16-21
union SELECT 'CONVERT(varchar(100), GETDATE(), 3)    ',        CONVERT(varchar(100), GETDATE(), 3)                           --01 16 2021 11:16AM
union SELECT 'CONVERT(varchar(100), GETDATE(), 4)    ',        CONVERT(varchar(100), GETDATE(), 4)                           --01/16/2021
union SELECT 'CONVERT(varchar(100), GETDATE(), 5)    ',        CONVERT(varchar(100), GETDATE(), 5)                           --2021.01.16
union SELECT 'CONVERT(varchar(100), GETDATE(), 6)    ',        CONVERT(varchar(100), GETDATE(), 6)                           --16/01/2021
union SELECT 'CONVERT(varchar(100), GETDATE(), 7)    ',        CONVERT(varchar(100), GETDATE(), 7)                           --16.01.2021
union SELECT 'CONVERT(varchar(100), GETDATE(), 8)    ',        CONVERT(varchar(100), GETDATE(), 8)                           --16-01-2021
union SELECT 'CONVERT(varchar(100), GETDATE(), 9)    ',        CONVERT(varchar(100), GETDATE(), 9)                           --16 01 2021
union SELECT 'CONVERT(varchar(100), GETDATE(), 10) ' ,        CONVERT(varchar(100), GETDATE(), 10)                        --01 16, 2021
union SELECT 'CONVERT(varchar(100), GETDATE(), 11) ' ,        CONVERT(varchar(100), GETDATE(), 11)                        --11:16:27
union SELECT 'CONVERT(varchar(100), GETDATE(), 12) ' ,        CONVERT(varchar(100), GETDATE(), 12)                        --01 16 2021 11:16:27:507AM
union SELECT 'CONVERT(varchar(100), GETDATE(), 13) ' ,        CONVERT(varchar(100), GETDATE(), 13)                        --21/01/16
union SELECT 'CONVERT(varchar(100), GETDATE(), 14) ' ,        CONVERT(varchar(100), GETDATE(), 14)                        --01-16-2021
union SELECT 'CONVERT(varchar(100), GETDATE(), 20) ' ,        CONVERT(varchar(100), GETDATE(), 20)                        --2021/01/16
union SELECT 'CONVERT(varchar(100), GETDATE(), 21) ' ,        CONVERT(varchar(100), GETDATE(), 21)                        --20210116
union SELECT 'CONVERT(varchar(100), GETDATE(), 22) ' ,        CONVERT(varchar(100), GETDATE(), 22)                        --16 01 2021 11:16:27:507
union SELECT 'CONVERT(varchar(100), GETDATE(), 23) ' ,        CONVERT(varchar(100), GETDATE(), 23)                        --11:16:27:507
union SELECT 'CONVERT(varchar(100), GETDATE(), 24) ' ,        CONVERT(varchar(100), GETDATE(), 24)                        --210116
union SELECT 'CONVERT(varchar(100), GETDATE(), 25) ' ,        CONVERT(varchar(100), GETDATE(), 25)                        --2021-01-16 11:16:27
union SELECT 'CONVERT(varchar(100), GETDATE(), 100)' ,        CONVERT(varchar(100), GETDATE(), 100)                       --2021-01-16 11:16:27.507
union SELECT 'CONVERT(varchar(100), GETDATE(), 101)' ,        CONVERT(varchar(100), GETDATE(), 101)                       --2021-01-16T11:16:27.507
union SELECT 'CONVERT(varchar(100), GETDATE(), 102)' ,        CONVERT(varchar(100), GETDATE(), 102)                       --16 01 2021 11:16:27:507
union SELECT 'CONVERT(varchar(100), GETDATE(), 103)' ,        CONVERT(varchar(100), GETDATE(), 103)                       -- 3 ????? ??????? 1442 11:16:27:507AM
union SELECT 'CONVERT(varchar(100), GETDATE(), 104)' ,        CONVERT(varchar(100), GETDATE(), 104)                       -- 3/06/1442 11:16:27:507AM
union SELECT 'CONVERT(varchar(100), GETDATE(), 105)' ,        CONVERT(varchar(100), GETDATE(), 105)                       --11:16:27:507
union SELECT 'CONVERT(varchar(100), GETDATE(), 106)' ,        CONVERT(varchar(100), GETDATE(), 106)                       --21.01.16
union SELECT 'CONVERT(varchar(100), GETDATE(), 107)' ,        CONVERT(varchar(100), GETDATE(), 107)                       --2021-01-16 11:16:27
union SELECT 'CONVERT(varchar(100), GETDATE(), 108)' ,        CONVERT(varchar(100), GETDATE(), 108)                       --2021-01-16 11:16:27.507
union SELECT 'CONVERT(varchar(100), GETDATE(), 109)' ,        CONVERT(varchar(100), GETDATE(), 109)                       --01/16/21 11:16:27 AM
union SELECT 'CONVERT(varchar(100), GETDATE(), 110)' ,        CONVERT(varchar(100), GETDATE(), 110)                       --2021-01-16
union SELECT 'CONVERT(varchar(100), GETDATE(), 111)' ,        CONVERT(varchar(100), GETDATE(), 111)                       --11:16:27
union SELECT 'CONVERT(varchar(100), GETDATE(), 112)' ,        CONVERT(varchar(100), GETDATE(), 112)                       --2021-01-16 11:16:27.507
union SELECT 'CONVERT(varchar(100), GETDATE(), 113)' ,        CONVERT(varchar(100), GETDATE(), 113)                       --16/01/21
union SELECT 'CONVERT(varchar(100), GETDATE(), 114)' ,        CONVERT(varchar(100), GETDATE(), 114)                       --16.01.21
union SELECT 'CONVERT(varchar(100), GETDATE(), 120)' ,        CONVERT(varchar(100), GETDATE(), 120)                       --16-01-21
union SELECT 'CONVERT(varchar(100), GETDATE(), 121)' ,        CONVERT(varchar(100), GETDATE(), 121)                       --16 01 21
union SELECT 'CONVERT(varchar(100), GETDATE(), 126)' ,        CONVERT(varchar(100), GETDATE(), 126)                       --01 16, 21
union SELECT 'CONVERT(varchar(100), GETDATE(), 130)' ,        CONVERT(varchar(100), GETDATE(), 130)                       --11:16:27
union SELECT 'CONVERT(varchar(100), GETDATE(), 131)' ,        CONVERT(varchar(100), GETDATE(), 131)                       --01 16 2021 11:16:27:507AM

set nocount off

varchar轉換DateTIme回去,根據格式,比如 '01 16 2021 11:16AM'對應   --SELECT 'CONVERT(varchar(100), GETDATE(), 0) 'T_Sql, CONVERT(varchar(100), GETDATE(), 0) ConvertResult --01 16 2021 11:16AM

declare @DateSt varchar(100) = '01 16 2021 11:16AM'
declare @Date datetime= CONVERT(datetime,@DateSt,0)
select @Date [Date],DATENAME(YY,@Date)Y,DATENAME(MM,@Date)M,DATENAME(DD,@Date)D
--1. Style=101時,表示日期字串為:mm/dd/yyyy格式 SELECT CONVERT(datetime,'11/1/2003',101) --結果:2003-11-01 00:00:00.000
--2. Style=101時,表示日期字串為:dd/mm/yyyy格式 SELECT CONVERT(datetime,'11/1/2003',103) --結果:2003-01-11 00:00:00.000
 

/*== 日期轉換為字串 ==*/ DECLARE @dt datetime SET @dt='2003-1-11'
--1. Style=101時,表示將日期轉換為:mm/dd/yyyy 格式 SELECT CONVERT(varchar,@dt,101) --結果:01/11/2003
--2. Style=103時,表示將日期轉換為:dd/mm/yyyy 格式 SELECT CONVERT(varchar,@dt,103) --結果:11/01/2003

/*== 這是很多人經常犯的錯誤,對非日期型轉換使用日期的style樣式 ==*/ SELECT CONVERT(varchar,'2003-1-11',101) --結果:2003-1-11
--1. /*--說明 SET DATEFORMAT設定對使用CONVERT把字元型日期轉換為日期的處理也具有影響 但不影響明確指定了style的CONVERT處理。 --*/
--示例 ,在下面的示例中,第一個CONVERT轉換未指定style,轉換的結果受SET DATAFORMAT的影響,第二個CONVERT轉換指定了style,轉換結果受style的影響。 --設定輸入日期順序為 日/月/年 SET DATEFORMAT DMY
--不指定Style引數的CONVERT轉換將受到SET DATEFORMAT的影響 SELECT CONVERT(datetime,'2-1-2005') --結果: 2005-01-02 00:00:00.000
--指定Style引數的CONVERT轉換不受SET DATEFORMAT的影響 SELECT CONVERT(datetime,'2-1-2005',101) --結果: 2005-02-01 00:00:00.000 GO
--2. /*--說明
--如果輸入的日期包含了世紀部分,則對日期進行解釋處理時 年份的解釋不受SET DATEFORMAT設定的影響。 --*/
--示例,在下面的程式碼中,同樣的SET DATEFORMAT設定,輸入日期的世紀部分與不輸入日期的世紀部分,解釋的日期結果不同。 DECLARE @dt datetime
--設定SET DATEFORMAT為:月日年 SET DATEFORMAT MDY
--輸入的日期中指定世紀部分 SET @dt='01-2002-03' SELECT @dt --結果: 2002-01-03 00:00:00.000
--輸入的日期中不指定世紀部分 SET @dt='01-02-03' SELECT @dt --結果: 2003-01-02 00:00:00.000 GO
--3. /*--說明
--如果輸入的日期不包含日期分隔符,那麼SQL Server在對日期進行解釋時 將忽略SET DATEFORMAT的設定。 --*/
--示例,在下面的程式碼中,不包含日期分隔符的字元日期,在不同的SET DATEFORMAT設定下,其解釋的結果是一樣的。 DECLARE @dt datetime
--設定SET DATEFORMAT為:月日年 SET DATEFORMAT MDY SET @dt='010203' SELECT @dt --結果: 2001-02-03 00:00:00.000
--設定SET DATEFORMAT為:日月年 SET DATEFORMAT DMY SET @dt='010203' SELECT @dt --結果: 2001-02-03 00:00:00.000
--輸入的日期中包含日期分隔符 SET @dt='01-02-03' SELECT @dt --結果: 2003-02-01 00:00:00.000
--以下示例演示了在不同的語言環境(SET LANGUAGE)下,DATENAME與CONVERT函式的不同結果。 USE master
--設定會話的語言環境為: English SET LANGUAGE N'English' SELECT DATENAME(Month,GETDATE()) AS [Month], DATENAME(Weekday,GETDATE()) AS [Weekday], CONVERT(varchar,GETDATE(),109) AS [CONVERT] /*--結果: Month    Weekday   CONVERT ------------- -------------- ------------------------------- March    Tuesday   Mar 15 2005 8:59PM --*/
--設定會話的語言環境為: 簡體中文 SET LANGUAGE N'簡體中文' SELECT DATENAME(Month,GETDATE()) AS [Month], DATENAME(Weekday,GETDATE()) AS [Weekday], CONVERT(varchar,GETDATE(),109) AS [CONVERT] /*--結果 Month    Weekday    CONVERT