最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL?Server各種日期時間計算語句

 更新時間:2023年08月06日 10:12:25   作者:離不火  
有時候我們需要獲取指定日期時間的數(shù)據(jù),那么就需要用到sqlserver中的日期時間算法了,下面腳本小編就為大家分享一下

下面的需要在sqlserver環(huán)境中測試

一、時間計算

select 
GetDate() '當前時間', 					--2022-11-23 10:42:09.947
DATEADD(yy,-1,GetDate()) '1年前', 		--2021-11-23 10:42:09.947
DATEADD(yy,1,GetDate()) '1年后', 		--2023-11-23 10:42:09.947
DATEADD(mm,-2,GetDate()) '2月前', 		--2022-09-23 10:42:09.947
DATEADD(mm,2,GetDate()) '2月后', 		--2023-01-23 10:42:09.947
DATEADD(hh,-3,GetDate()) '3小時前', 		--2022-11-23 07:42:09.947
DATEADD(hh,3,GetDate()) '3小時后', 		--2022-11-23 13:42:09.947
DATEADD(minute,-5,GetDate()) '5分鐘前', 	--2022-11-23 10:37:09.947
DATEADD(minute,5,GetDate()) '5分鐘后', 	--2022-11-23 10:47:09.947
DATEADD(ss,-10,GetDate()) '10秒前', 	--2022-11-23 10:41:59.947
DATEADD(ss,10,GetDate()) '10秒后' 		--2022-11-23 10:42:19.947

結果:

在這里插入圖片描述

二、獲取整點時間

select
GetDate() '當前時間',									--2022-11-23 10:42:09.947
Convert(Char(14),GetDate(),120)+'00:00.000' '整點時間',	--2022-11-23 10:00:00.000
Convert(Char(17),GetDate(),120)+'00.000' '整分時間'		--2022-11-23 10:42:00.000

結果:

在這里插入圖片描述

三、獲取年月日、時分秒

select
GetDate() '當前時間',				--2022-11-23 10:42:09.947
DATEPART(year,GETDATE()) '年', 		--2022
DATEPART(MONTH ,GETDATE()) '月',	--11
DATEPART(day ,GETDATE()) '日',		--23
DATEPART(hour ,GETDATE()) '時',		--10
DATEPART(MINUTE ,GETDATE()) '分',	--42
DATEPART(SECOND ,GETDATE()) '秒'	--9

結果:

在這里插入圖片描述

四、計算兩個日期之間相差多少年月日、時分秒

select
DATEDIFF(yy,'2018-06-20','2022-11-25') '相差多少年',
DATEDIFF(mm,'2022-06-20','2022-11-25') '相差多少月',
DATEDIFF(dd,'2022-11-23','2022-11-25') '相差多少日',
DATEDIFF(hh,'2022-11-25 08:00','2022-11-25 10:30') '相差多少小時',
DATEDIFF(MINUTE,'2022-11-25 10:00','2022-11-25 10:30') '相差多少分',
DATEDIFF(ss,'2022-11-25 10:25:20','2022-11-25 10:30:30') '相差多少秒'

結果:

在這里插入圖片描述

SQL Server時間算法總結

declare @date  datetime 
set @date=getdate() 
--前一天,給定日期的前一天 
select dateadd(day,-1,@date) AS '前一天' 
--后一天,給定日期的后一天  
select dateadd(day,1,@date) AS '后一天' 
go 
--月初,計算給定日期所在月的第一天 
--這個計算的技巧是先計算當前日期到“1900-01-01”的時間間隔數(shù),然后把它加到“1900-01-01”上來獲得特殊的日期,這個技巧可以用---來計算很多不同的日期。 
declare @date  datetime 
set @date=getdate() 
select dateadd(month,datediff(month,'1900-01-01',@date),'1900-01-01') AS '所在月的第一天' 
--精簡算法,根據(jù)SQL Server的時間表示方式可知,'1900-01-01' 可以用0代替 
select dateadd(month,datediff(month,0,@date),0) AS '所在月的第一天' 
--上面兩種算法精確到天 時分秒均為00:00:00.000 
--下面算法課以保留時分秒 
--思路:用給定日期減去月第一天與給定日期差的天數(shù) 
select dateadd(day,1-datepart(day,@date),@date) 
go 
--月末,計算給定日期所在月的最后一天 
declare @date  datetime 
set @date=getdate() 
--思路:當前月的下一月1號在減1天 
select dateadd(day,-1,dateadd(month,1+datediff(month,'1900-01-01',@date),'1900-01-01')) AS '所在月的最一天' 
select dateadd(month,1+datediff(month,'1900-01-01',@date),'1900-01-01')-1 AS '所在月的最一天' 
--1900-01-01 用0代替 
select dateadd(day,-1,dateadd(month,1+datediff(month,0,@date),0)) AS '所在月的最一天' 
select dateadd(month,1+datediff(month,0,@date),0)-1 AS '所在月的最一天' 
--思路:與月初計算思路相同 
select dateadd(month,datediff(month,'1989-12-31',@date),'1989-12-31') AS '所在月的最一天' 
--精簡算法,'1989-12-31' 用-1代替 
select dateadd(month,datediff(month,-1,@date),-1) AS '所在月的最一天' 
--保留時分秒的算法 
select dateadd(day,-1,dateadd(month,1,dateadd(day,1-datepart(day,@date),@date))) 
go 
--其他月計算 
--計算給定日期所在月的上月第一天 
declare @date  datetime 
set @date=getdate() 
--當前月第一天減去一個月 
select dateadd(month,-1,dateadd(month,datediff(month,0,@date),0)) AS '上月第一天' 
--簡化 
select dateadd(month,datediff(month,0,@date)-1,0) AS '上月第一天' 
--另一種當前月第一天算法 
select dateadd(month,-1,dateadd(day,1-datepart(day,@date),@date)) '上月第一天' 
go 
--計算給定日期所在月的上月最后一天 
declare @date  datetime 
set @date=getdate() 
--當前月第一天減去一天 
select dateadd(day,-1,dateadd(month,datediff(month,0,@date),0)) AS '上月最后一天' 
--另一種當前月第一天算法 
select dateadd(day,-1,dateadd(day,1-datepart(day,@date),@date)) '上月最后一天' 
select dateadd(day,1-datepart(day,@date),@date)-1 '上月最后一天' 
--另一種算法,不能用當前月的最后一天加一個月,因為當前月可能是30天。 
--例如 select dateadd(month,1,'2010-06-30') --結果是2010-07-30而不是2010-07-31, 
--這也是月末算法采用下月第一天減1天計算的原因 
--但是如果計算月是31天擇無此問題 
--例如 select dateadd(month,1,'2010-05-31') --結果是2010-06-30 
--因此下面算法是正確的,-1 表示'1899-12-31 00:00:00.000'-- select CONVERT(datetime,-1)  
select dateadd(month,datediff(month,-1,@date)-1,-1) 
--另一種當前月算法 
select dateadd(day,-1,dateadd(day,1-datepart(day,@date),@date)) '上月最后一天' 
--簡化 
select dateadd(day,0-datepart(day,@date),@date) '上月最后一天' 
go 
--計算給定日期所在月的下月第一天 
declare @date  datetime 
set @date=getdate() 
--當前月第一天加一個月 
select dateadd(month,1,dateadd(month,datediff(month,0,@date),0)) AS '下月第一天' 
--簡化 
select dateadd(month,datediff(month,0,@date)+1,0) AS '下月第一天' 
--另一種當前月第一天算法 
select dateadd(month,1,dateadd(day,1-datepart(day,@date),@date)) '下月第一天' 
go 
--計算給定日期所在月的下月最后一天 
declare @date  datetime 
set @date=getdate() 
--當前月第一天加2個月再減去1天 
select dateadd(day,-1,dateadd(month,2,dateadd(month,datediff(month,0,@date),0))) AS '下月最后一天' 
--簡化 
select dateadd(day,-1,dateadd(month,datediff(month,0,@date)+2,0)) AS '下月最后一天' 
select dateadd(month,datediff(month,0,@date)+2,0)-1 AS '下月最后一天' 
--另一種算法 
select dateadd(month,datediff(month,-1,@date)+1,-1) '下月最后一天' 
--另一種當前月第一天算法 
select dateadd(day,-1,dateadd(month,2,dateadd(day,1-datepart(day,@date),@date))) '下月最后一天' 
go 
--所在星期的第一天,計算給定日期所在星期的第1天(星期日為第一天)  
declare @date  datetime 
set @date= getdate() 
--與SQL Server語言版本相關的算法 
--思路:當前日期+星期日(每周的第1天)與當前日期的差的天數(shù) 
--datepart(weekday,DATE)的返回值與@@dateFIRST相關 
set DATEFIRST 7 -- 或者設置為美國英語set LANGUAGE us_english; (星期日為第一天) 
select dateadd(weekday,1-datepart(weekday,@date),@date) AS '所在星期的第一天,星期日' 
--星期日,與SQL Server語言版本或@@dateFIRST無關 
--'1989-12-31' 是星期日,'1989-12-31' 再加上(當前日期與1989-12-31差的星期數(shù))個星期 
select dateadd(week,datediff(week,-1,@date),-1) AS '所在星期的星期日' 
--或者 
select dateadd(week,datediff(week,6,@date),6) AS '所在星期的星期日' 
go 
--所在星期的第二天,計算給定日期所在星期的第2天(星期日為第一天) 
declare @date  datetime 
set @date= getdate() 
--思路:當前日期+星期一(每周的第2天)與當前日期的差的天數(shù) 
--datepart(weekday,DATE)的返回值與@@dateFIRST相關 
set DATEFIRST 7 -- 或者設置為美國英語set LANGUAGE us_english; (星期日為第一天) 
select dateadd(day,2-datepart(weekday,@date),@date) AS '所在星期的第二天,星期一' 
--星期一,與SQL Server語言版本或@@dateFIRST無關 
--'1900-01-01' 是星期一,'1900-01-01' 再加上(當前日期與1900-01-01差的星期數(shù))個星期 
select dateadd(week,datediff(week,0,@date),0) AS '所在星期的星期一' 
go 
--上個星期第一天,計算給定日期所在星期的上一個星期日(星期日為第一天) 
declare @date  datetime 
set @date= getdate() 
--思路:當前日志所在星期的星期日再減1周 
--datepart(weekday,DATE)的返回值與@@dateFIRST相關 
set DATEFIRST 7 -- 或者設置為美國英語set LANGUAGE us_english; (星期日為第一天) 
select dateadd(week,-1,dateadd(day,1-datepart(weekday,@date),@date)) AS '上個星期第一天,星期日' 
--一周等于7天 
select dateadd(day,-7,dateadd(day,1-datepart(weekday,@date),@date)) AS '上個星期第一天,星期日' 
--簡化 
select dateadd(day,-6-datepart(weekday,@date),@date) AS '上個星期第一天,星期日' 
--上個星期日,與SQL Server語言版本或@@dateFIRST無關 
select dateadd(week,-1+datediff(week,-1,@date),-1) AS '上個星期日' 
--或者 
select dateadd(week,datediff(week,6,@date),-1) AS '上個星期日' 
go 
--下個星期第一天,計算給定日期所在星期的下一個星期日(星期日為第一天) 
declare @date  datetime 
set @date= getdate() 
--思路:當前日志所在星期的星期日再加1周 
--datepart(weekday,DATE)的返回值與@@dateFIRST相關 
set DATEFIRST 7 -- 或者設置為美國英語set LANGUAGE us_english; (星期日為第一天) 
select dateadd(week,1,dateadd(day,1-datepart(weekday,@date),@date)) AS '下個星期第一天,星期日' 
--一周等于7天 
select dateadd(day,7,dateadd(day,1-datepart(weekday,@date),@date)) AS '下個星期第一天,星期日' 
--簡化 
select dateadd(day,8-datepart(weekday,@date),@date) AS '下個星期第一天,星期日' 
--下個星期日,與SQL Server語言版本或@@dateFIRST無關 
select dateadd(week,1+datediff(week,-1,@date),-1) AS '下個星期日' 
--或者 
select dateadd(week,datediff(week,-1,@date),6) AS '下個星期日' 
go 
--判斷給定日期是星期幾 
declare @date  datetime 
set @date= getdate() 
--datepart(weekday,DATE)的返回值與@@dateFIRST相關 
set DATEFIRST 7 -- 或者設置為美國英語set LANGUAGE us_english; (星期日為第一天) 
select datepart(weekday,@date) --返回值 1-星期日,2-星期一,3-星期二......7-星期六 
--上面算法與SQL 語言版本或 @@dateFIRST 相關 
--下面算法與SQL Server語言版本或@@dateFIRST無關 
select datename(weekday,@date) '星期'  
go 
--年度計算 
declare @date  datetime 
set @date=getdate() 
--年初,計算給定日期所在年的第一天 
select dateadd(year,datediff(year,0,@date),0) AS '所在年的第一天' 
--年末,計算給定日期所在年的最后一天 
select dateadd(year,datediff(year,-1,@date),-1) AS '所在年的最后一天' 
--上一年年初,計算給定日期所在年的上一年的第一天 
select dateadd(year,datediff(year,-0,@date)-1,0) AS '所在年的上一年的第一天' 
--上一年年末,計算給定日期所在年的上一年的最后一天 
select dateadd(year,datediff(year,0,@date),-1) AS '所在年的上一年的最后一天' 
--下一年年初,計算給定日期所在年的下一年的第一天 
select dateadd(year,1+datediff(year,0,@date),0) AS '所在年的下一年的第一天' 
--下一年年末,計算給定日期所在年的下一年的最后一天 
select dateadd(year,1+datediff(year,-1,@date),-1) AS '所在年的下一年的最后一天' 
go 
--季度計算 
declare @date  datetime 
set @date=getdate() 
--季度初,計算給定日期所在季度的第一天 
select dateadd(quarter,datediff(quarter,0,@date),0) AS '當前季度的第一天' 
--季度末,計算給定日期所在季度的最后一天 
select dateadd(quarter,1+datediff(quarter,0,@date),-1) AS '當前季度的最后一天' 
--上個季度初 
select dateadd(quarter,datediff(quarter,0,@date)-1,0) AS '當前季度的上個季度初' 
--上個季度末 
select dateadd(quarter,datediff(quarter,0,@date),-1) AS '當前季度的上個季度末' 
--下個季度初 
select dateadd(quarter,1+datediff(quarter,0,@date),0) AS '當前季度的下個季度初' 
--下個季度末 
select dateadd(quarter,2+datediff(quarter,0,@date),-1) AS '當前季度的下個季度末' 
go 
--計算給定日期所在月的天數(shù) 
declare @date datetime; 
set @date = getdate() 
--本月度第一天與下月度第一天所差的天數(shù) 
select datediff(day,dateadd(month,datediff(month,0,@date),0),dateadd(month,1+datediff(month,0,@date),0)) 
--借助變量簡化 
select @date = dateadd(month,datediff(month,0,@date),0) --本月度第一天 
select datediff(day,@date,dateadd(month,1,@date)) 
--另一種思路:給定月最后一天的日期,記為本月天數(shù) 
select day(dateadd(month,datediff(month,-1,@date),-1)) 
go 
--計算給定日期所在季度的天數(shù) 
declare @date datetime; 
set @date = getdate() 
--本季度第一天與下季度第一天所差的天數(shù) 
select datediff(day,dateadd(quarter,datediff(quarter,0,@date),0),dateadd(quarter,1+datediff(quarter,0,@date),0)) 
--借助變量簡化 
select @date = dateadd(quarter,datediff(quarter,0,@date),0) --本季度第一天 
select datediff(day,@date,dateadd(quarter,1,@date)) 
go 
--計算給定日期所在年度的天數(shù) 
declare @date datetime; 
set @date = getdate() 
--本年度第一天與下年度第一天所差的天數(shù) 
select datediff(day,dateadd(year,datediff(year,0,@date),0),dateadd(year,1+datediff(year,0,@date),0)) 
--借助變量簡化 
select @date = dateadd(year,datediff(year,0,@date),0) --本年度第一天 
select datediff(day,@date,dateadd(year,1,@date)) 
go 
--判斷給定日期所在年是否閏年 
--根據(jù)全年總天數(shù)判斷 
declare @date datetime; 
set @date = getdate() 
select CASE datediff(day,dateadd(year,datediff(year,0,@date),0),dateadd(year,1+datediff(year,0,@date),0))  
  WHEN 365 THEN '平年' ELSE '閏年' END  
--根據(jù)二月天數(shù)判斷 
--給日期的上一年最后一天加2個月,即為當年2月最后一天 
select CASE day(dateadd(month,2,dateadd(year,datediff(year,0,@date),-1))) WHEN 28 THEN '平年' ELSE '閏年' END  
go 
--計算給定日期是當年的第幾天 
declare @date datetime; 
set @date = getdate() 
select datepart(dayOFyear,@date) [dayOfyear]; 
select datename(dayOFyear,@date)  [dayOfyear]; 
--另一種思路:當前日期與上年最后一天差的天數(shù) 
select datediff(day,dateadd(year,datediff(year,0,@date),-1),@date)[dayOfyear] 
go 
--計算給定日期是當年的第幾周 
declare @date datetime; 
set @date = getdate() 
select datepart(week,@date) [weekOfyear]; --返回int型 
select datename(week,@date) [weekOfyear]; --返回varchar型 
go 
--計算給定日期是當年的第幾月 
declare @date datetime; 
set @date = getdate() 
select datepart(month,@date) [monthOfyear]; --返回int型 
select datename(month,@date) [monthOfyear]; --返回varchar型 
select month(@date) [monthOfyear];--返回int型 
go 
--計算給定日期是當年的第幾季度 
declare @date datetime; 
set @date = getdate() 
select datepart(quarter,@date) [quarterOfyear]; --返回int型 
select datename(quarter,@date) [quarterOfyear]; --返回varchar型 
go 
--計算給定日期是當月的第幾周 
declare @date datetime; 
set @date = getdate() 
--思路,給定日期是當年的第幾周-給定日期所在月第一天是當年的第幾周 
select datepart(week,@date)-datepart(week,dateadd(month,datediff(month,0,@date),0))+1 [weekOfmonth] 
select datepart(week,@date)-datepart(week,dateadd(day,1-datepart(day,@date),@date))+1 [weekOfmonth] 
go 
--計算給定日期所在月的第一個星期一是哪天 
declare @date datetime; 
set @date = getdate() 
--思路,1900-01-01(星期一)加上(給定日志所在月的月6號與1900-01-01差的周數(shù))個周 
--為什么不選7號?如果是7號,那么7好恰好是星期日的話,第一個周一就會算到8號。 
--為什么不選5號?如果5號是星期六,那么周一就跑到上月了。小于5號與這個道理一樣。 
select dateadd(week,datediff(week,0,dateadd(day,6-datepart(day,@date),@date)),0) '所在月的第一個星期一' 
select dateadd(week,datediff(week,0,dateadd(day,6-datepart(day,@date),@date)),7) '所在月的第二個星期一' 
select dateadd(week,datediff(week,0,dateadd(day,6-datepart(day,@date),@date)),1) '所在月的第一個星期二' 
select dateadd(week,datediff(week,0,dateadd(day,6-datepart(day,@date),@date)),8) '所在月的第二個星期二' 
go 

SQL Server DATEADD函數(shù)詳解

一、DATEADD函數(shù)簡介

在SQL Server中,DATEADD函數(shù)用于在日期中添加或減去指定的時間間隔。這個函數(shù)能夠處理日期天數(shù)、小時、分鐘、秒、毫秒等各種單位,返回一個新日期。

DATEADD函數(shù)的基本用法如下:

DATEADD(datepart,interval,datetime)

其中參數(shù)的解釋如下:

datepart: 需要添加的日期部分,如年(YEAR)、季度(QUARTER)、月(MONTH)、周(WEEK)、天(DAY)、小時(HOUR)、分鐘(MINUTE)、秒(SECOND)等。

interval: 需要添加的時間間隔,可以為正數(shù)或負數(shù)。

datetime: 要進行加、減操作的日期。

下面我們將從多個方面詳細介紹DATEADD函數(shù)的使用。

二、按不同單位進行操作

在DATEADD函數(shù)中,可以根據(jù)需求選擇不同的日期部分。

1、按年進行操作:

SELECT DATEADD(YEAR,1,'2019-02-28')

運行以上代碼,會返回一個新日期:2020-02-28。

2、按月進行操作:

SELECT DATEADD(MONTH,3,'2019-02-28')

運行以上代碼,會返回一個新日期:2019-05-28。

3、按日進行操作:

SELECT DATEADD(DAY,7,'2019-02-28')

運行以上代碼,會返回一個新日期:2019-03-07。

4、按小時進行操作:

SELECT DATEADD(HOUR,2,'2019-02-28 13:45:23')

運行以上代碼,會返回一個新日期:2019-02-28 15:45:23。

5、按分鐘進行操作:

SELECT DATEADD(MINUTE,15,'2019-02-28 13:45:23')

運行以上代碼,會返回一個新日期:2019-02-28 14:00:23。

6、按秒進行操作:

SELECT DATEADD(SECOND,30,'2019-02-28 13:45:23')

運行以上代碼,會返回一個新日期:2019-02-28 13:45:53。

三、使用變量進行操作

在使用DATEADD函數(shù)時,也可以使用變量來進行操作。

DECLARE @startdate DATETIME
    SET @startdate = '2019-02-28 13:45:23'
    SELECT DATEADD(HOUR,2,@startdate)

運行以上代碼,會返回一個新日期:2019-02-28 15:45:23。

四、多次操作

在DATEADD函數(shù)中,也可以進行多次操作。

SELECT DATEADD(YEAR,1,DATEADD(MONTH,3,DATEADD(DAY,7,'2019-02-28')))

運行以上代碼,會返回一個新日期:2020-05-07。

五、與其他函數(shù)聯(lián)合使用

在實際應用中,DATEADD函數(shù)還可以與其他的函數(shù)聯(lián)合使用。

1、使用YEAR函數(shù)獲取年份:

SELECT YEAR(DATEADD(YEAR,1,'2019-02-28'))

運行以上代碼,會返回一個整數(shù):2020。

2、使用DATENAME函數(shù)獲取月份名稱:

SELECT DATENAME(MONTH,DATEADD(MONTH,3,'2019-02-28'))

運行以上代碼,會返回一個字符串:May。

六、錯誤處理

在使用DATEADD函數(shù)時,如果指定的日期部分或時間間隔不合法,會出現(xiàn)一些錯誤。以下是一些常見的錯誤:

1、指定的日期部分不合法:

SELECT DATEADD(test,1,'2019-02-28')

運行以上代碼,會返回一個錯誤:The datepart "test" is not supported by date function dateadd for data type date.

2、指定的時間間隔為0:

SELECT DATEADD(MONTH,0,'2019-02-28')

運行以上代碼,會返回一個錯誤:The dateadd function requires that the specified interval be nonzero.

3、指定的日期不合法:

SELECT DATEADD(YEAR,1,'2019-02-30')

運行以上代碼,會返回一個錯誤:The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

七、總結

本文介紹了SQL Server中的DATEADD函數(shù),講解了它的基本用法、按不同單位進行操作、使用變量進行操作、多次操作、與其他函數(shù)聯(lián)合使用、錯誤處理等方面內容。使用DATEADD函數(shù)可以很方便地對日期進行操作,提升了SQL Server的數(shù)據(jù)處理能力。

相關文章

最新評論

永州市| 青铜峡市| 廉江市| 上虞市| 洛川县| 盐亭县| 阳江市| 阜阳市| 平昌县| 夏津县| 高碑店市| 东阳市| 肥乡县| 改则县| 沙田区| 秦皇岛市| 思茅市| 新巴尔虎左旗| 平罗县| 原平市| 重庆市| 文成县| 盐边县| 云安县| 龙井市| 清河县| 盘山县| 盐山县| 西青区| 凯里市| 林州市| 健康| 清远市| 东港市| 刚察县| 工布江达县| 涪陵区| 泌阳县| 迁西县| 沅陵县| 昌吉市|