首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-04-22 
SQL Server 2008关于日期时间的问题输入一个月份,要查询这个月第n个工作日具体时间,工作日是指除开周六周

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
SELECTDATEADD(DAY,1,AAA.RIQI) 
FROMAAA
WHERERIQI<DATEADD(DAY,-1,DATEADD(MONTH,1,@Riqi))
)
,BBB AS
(
SELECTRIQI,
DATEPART(WEEKDAY,RIQI) AS DAYWEEK
FROMAAA
)
,CCC AS
(
SELECTROW_NUMBER() OVER(ORDER BY RIQI) AS ROWINDEX,
RIQI,
DAYWEEK
FROMBBB
WHEREDAYWEEK NOT IN (6,7)
)
SELECTRIQI
FROMCCC
WHEREROWINDEX=@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 intselect @y = 2012, @m = 3, @workday = 10declare @date datetime = ltrim(@y*10000+@m*100+1)set @date-=1while (@workday>0) select @date+=1, @workday-=sign((datepart(weekday,@date)+@@datefirst-1)%7%6)select @date -- 2012-03-14 00:00:00.000 

热点排行