SQL Server 2008关于日期时间的问题

nightgoblin 2012-04-16 04:59:29
输入一个月份,要查询这个月第n个工作日具体时间,工作日是指除开周六周日的时间,例如:2012年3月份的第10个工作日是3月14日。
这样一个函数或者过程应该怎样写呢?
...全文
165 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vidor 2012-04-17
  • 打赏
  • 举报
回复
循环最简单

declare @y int, @m int, @workday int
select @y = 2012, @m = 3, @workday = 10

declare @date datetime = ltrim(@y*10000+@m*100+1)
set @date-=1
while (@workday>0) select @date+=1, @workday-=sign((datepart(weekday,@date)+@@datefirst-1)%7%6)

select @date -- 2012-03-14 00:00:00.000


根据1号是星期几也可以推算。
imtsr 2012-04-17
  • 打赏
  • 举报
回复
10楼的代码是一个自定义的函数,很方便的。不麻烦啊。
nightgoblin 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
一般像楼主这种需求,首先要建立一个工作日表,存放非工作日的日期,然后结合这个表进行统计。

MSSQL2005及以上版本:
SET DATEFIRST 1
DECLARE @Month INT, --月份
@Day INT, --第N个工作日
@Riqi DATETIME
SELECT @Month=3,@Day=11

SET @Riqi=CAST(LTRIM(YEAR(GET……
[/Quote]
你的方法也可以,我也考虑过,觉得这样好复杂啊,但有没有其他更好的方法呢?
gogodiy 2012-04-17
  • 打赏
  • 举报
回复
请看9楼代码
nightgoblin 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
可以用一個循環,從該月第一天開始判斷(使用daynumber),如果不是周六或周日則變量加1,直到變量與所需戔工作日相等,再返回日期
[/Quote]
你的想法是不错,但是用SQL语句怎样实现呢?
imtsr 2012-04-17
  • 打赏
  • 举报
回复
自定义函数解决这个问题吧。
你还可以把节假日加进去。

CREATE TABLE tb_Holiday(
HDate smalldatetime primary key clustered, --节假日期
Name nvarchar(50) not null) --假日名称
GO


--在指定日期上增加工作天数
CREATE FUNCTION f_WorkDayADD(
@date datetime, --基础日期
@workday int --要增加的工作日数
)RETURNS datetime
AS
BEGIN
IF @workday>0
WHILE @workday>0
SELECT @date=@date+@workday,@workday=count(*)
FROM tb_Holiday
WHERE HDate BETWEEN @date AND @date+@workday
ELSE
WHILE @workday<0
SELECT @date=@date+@workday,@workday=-count(*)
FROM tb_Holiday
WHERE HDate BETWEEN @date AND @date+@workday
RETURN(@date)
END

gogodiy 2012-04-17
  • 打赏
  • 举报
回复
一般像楼主这种需求,首先要建立一个工作日表,存放非工作日的日期,然后结合这个表进行统计。

MSSQL2005及以上版本:
SET DATEFIRST 1
DECLARE @Month INT, --月份
@Day INT, --第N个工作日
@Riqi DATETIME
SELECT @Month=3,@Day=11

SET @Riqi=CAST(LTRIM(YEAR(GETDATE()))+'-'+LTRIM(@Month)+'-01' AS DATETIME)

;WITH AAA AS
(
SELECT @Riqi AS RIQI
UNION ALL
SELECT DATEADD(DAY,1,AAA.RIQI)
FROM AAA
WHERE RIQI<DATEADD(DAY,-1,DATEADD(MONTH,1,@Riqi))
)
,BBB AS
(
SELECT RIQI,
DATEPART(WEEKDAY,RIQI) AS DAYWEEK
FROM AAA
)
,CCC AS
(
SELECT ROW_NUMBER() OVER(ORDER BY RIQI) AS ROWINDEX,
RIQI,
DAYWEEK
FROM BBB
WHERE DAYWEEK NOT IN (6,7)
)
SELECT RIQI
FROM CCC
WHERE ROWINDEX=@Day
baiynije 2012-04-17
  • 打赏
  • 举报
回复
主要用到的函數應該有dateadd ,datepart
baiynije 2012-04-17
  • 打赏
  • 举报
回复
可以用一個循環,從該月第一天開始判斷(使用daynumber),如果不是周六或周日則變量加1,直到變量與所需戔工作日相等,再返回日期
nightgoblin 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
输入一个月份,要查询这个月第n个工作日具体时间,工作日是指除开周六周日的时间,例如:2012年3月份的第10个工作日是3月14日。
这样一个函数或者过程应该怎样写呢?
这个貌似有点复杂,最好用C语言或C++写比较好。
[/Quote]
额,有那么难么?
nightgoblin 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
法定的节假日需要计算在内吗?
[/Quote]
暂时不需要考虑节假日。
nightgoblin 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

自定义函数解决这个问题吧。
你还可以把节假日加进去。

CREATE TABLE tb_Holiday(
HDate smalldatetime primary key clustered, --节假日期
Name nvarchar(50) not null) --假日名称
GO


--在指定日期上增加工作天数
CREATE FUNCTION f_W……
[/Quote]
感谢各位的回答,我还是参考gogodiy的回答,建立一个工作日期表,在进行判断。
以下是我的代码:

IF OBJECT_ID('fnWorkday') IS NOT NULL
DROP FUNCTION fnWorkday;
GO
CREATE FUNCTION fnWorkday
(@date INT ,
@n INT )
RETURNS DATETIME
AS
BEGIN
DECLARE @m INT ,--增长的天数
@d INT ,--当月的天数
@wdate VARCHAR(10), --工作日期
@tyw AS tyWorkday,
@workday DATETIME --需要返回的工作日期
SET @m=1;
SET @wdate=@date*100+@m;
SET @d=DATEDIFF(DAY,@wdate,DATEADD(MONTH,1,@wdate ));
WHILE @m<=@d
BEGIN
SET @wdate=@date*100+@m;
/*当日期不是周六、周日的时候插入到@tyw表*/
IF DATEPART(dw,@wdate) NOT IN (1,7)
BEGIN
INSERT INTO @tyw VALUES(@wdate);
END;
SET @m=@m+1;
END;
SELECT @workday=Workday FROM @tyw WHERE Id=@n;
RETURN @workday;
END;
--调用
SELECT dbo.fnWorkday(201204,10);
/*
(无列名)
2012-04-13 00:00:00.000
*/


leijunyuncyuyan 2012-04-16
  • 打赏
  • 举报
回复
输入一个月份,要查询这个月第n个工作日具体时间,工作日是指除开周六周日的时间,例如:2012年3月份的第10个工作日是3月14日。
这样一个函数或者过程应该怎样写呢?
这个貌似有点复杂,最好用C语言或C++写比较好。
imtsr 2012-04-16
  • 打赏
  • 举报
回复
法定的节假日需要计算在内吗?
nightgoblin 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

表结构,给个。再给点数据。
[/Quote]
这个只是写个函数或是过程,例如传递日期201205
,然后返回我要的结果。
imtsr 2012-04-16
  • 打赏
  • 举报
回复
表结构,给个。再给点数据。

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧