Sql Server 几个时间计算方法

下面的参数都是传入一个日期,试验时可用GETDATE()

1、求当月第一天

select @DATE-DAY(@DATE)+1

2、求下月第一天

select DATEADD(MONTH,1,@DATE-DAY(@DATE)+1)

就是在当月第一天的基础上+1月

3、求当月最后一天

select DATEADD(MONTH,1,@DATE-DAY(@DATE)+1)-1

就是在下月第一天的基础上-1天

4、求当月的天数

select DAY(DATEADD(MONTH,1,@DATE-DAY(@DATE)+1)-1)

就是对当月最后一天进行day运算

5、求当月的所有日期

SELECT DATEADD(DAY,NUMBER,@DATE-DAY(@DATE)+1) AS DAT
FROM MASTER..SPT_VALUES
WHERE TYPE='P' AND DAY(DATEADD(MONTH,1,@DATE-DAY(@DATE)+1)-1)>NUMBER

下面还有,省略了。

6、求当月的第几周

SELECT DATEPART(WEEK,@DATE)-DATEPART(WEEK,@DATE-DAY(@DATE)+1)+1

网上找的是一个很复杂的算法,如下:

SELECT DATEPART(WEEK,DAT)-DATEPART(WEEK,@DATE-DAY(@DATE)+1)+1
FROM (
SELECT DATEADD(DAY,NUMBER,@DATE-DAY(@DATE)+1) AS DAT
FROM MASTER..SPT_VALUES
WHERE TYPE='P' AND DAY(DATEADD(MONTH,1,@DATE-DAY(@DATE)+1)-1)>NUMBER
) T
WHERE DAT=@DATE

其实和上面那个是等效的,这太搞笑了吧?算这么久,其实就想给它传个当天的参数?

好吧,网上找的一个算指定日期在当月是第几周的算法如下:

CREATE FUNCTION  [dbo].[fn_getWkOfMonth](@DATE_Param DATETIME)
RETURNS int
AS
begin

DECLARE @DATE DATETIME
DECLARE @wkOfMonth int
SET @DATE=@DATE_Param
set @wkOfMonth=(SELECT DATEPART(WEEK,DAT)-DATEPART(WEEK,@DATE-DAY(@DATE)+1)+1
FROM (
SELECT DATEADD(DAY,NUMBER,@DATE-DAY(@DATE)+1) AS DAT
FROM MASTER..SPT_VALUES
WHERE TYPE='P' AND DAY(DATEADD(MONTH,1,@DATE-DAY(@DATE)+1)-1)>NUMBER
) T
WHERE DAT=@DATE)
return @wkOfMonth
end

GO

把它换成下面这个敢不敢?

CREATE FUNCTION  [dbo].[fn_getWkOfMonth2](@DATE_Param DATETIME)
RETURNS int
AS
begin

DECLARE @DATE DATETIME
DECLARE @wkOfMonth int
SET @DATE=@DATE_Param
set @wkOfMonth=(DATEPART(WEEK,@DATE)-DATEPART(WEEK,@DATE-DAY(@DATE)+1)+1)
return @wkOfMonth
end

GO




原文地址:https://www.cnblogs.com/thinkCoding/p/2267354.html