日期:2014-05-18  浏览次数:20553 次

SQL Server 2008关于日期时间的问题
输入一个月份,要查询这个月第n个工作日具体时间,工作日是指除开周六周日的时间,例如:2012年3月份的第10个工作日是3月14日。
这样一个函数或者过程应该怎样写呢?

------解决方案--------------------
输入一个月份,要查询这个月第n个工作日具体时间,工作日是指除开周六周日的时间,例如:2012年3月份的第10个工作日是3月14日。
这样一个函数或者过程应该怎样写呢?
这个貌似有点复杂,最好用C语言或C++写比较好。
------解决方案--------------------
主要用到的函數應該有dateadd ,datepart
------解决方案--------------------
一般像楼主这种需求,首先要建立一个工作日表,存放非工作日的日期,然后结合这个表进行统计。

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
------解决方案--------------------
自定义函数解决这个问题吧。
你还可以把节假日加进去。

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


------解决方案--------------------
循环最简单

SQL code
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