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