判断两个时间之间有多少个工作日,C#、SQL

jb2008 2004-08-17 03:47:58
DateTime dt1;
DateTime dt2;

计算 dt1 到 dt2之间有多少个工作日,
工作日定义:除周六与周日以外的日子。

用C# 与 SQL 写,择优给分。
...全文
1289 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
khpcg 2004-08-20
  • 打赏
  • 举报
回复
多些判断就可以了
jb2008 2004-08-20
  • 打赏
  • 举报
回复
darkm00n(黑月) SQL 写得简练,如果不是中文SQL Server 怎么办?
阿云ivan 2004-08-19
  • 打赏
  • 举报
回复
UP
amami 2004-08-19
  • 打赏
  • 举报
回复
以上是从水晶报表中导出的函数!你看看有没什么帮助!不一定好用!
amami 2004-08-19
  • 打赏
  • 举报
回复
Function cdDateAddSkipHolidays (nWorkingDays As Number, startDateTime As DateTime) As DateTime
'结果 = startDateTime + nWorkingDays + nHolidays(包括周末)
'下面的算法在 nWorkingDays 为负时也适用

Dim totalDays
'给出对总天数的大致预计。每出现 5 个工作日,就会有 7
'天。额外的周末 2 天也包括在内,以算作不完整的一周。
totalDays = Fix(nWorkingDays * 7 / 5 + 1) + 2

Dim iteratedDiff
iteratedDiff = cdDateDiffSkipHolidays (startDateTime, startDateTime + totalDays)

If (iteratedDiff >= nWorkingDays) Then
Do While iteratedDiff >= nWorkingDays
totalDays = totalDays - 1
iteratedDiff = cdDateDiffSkipHolidays (startDateTime, startDateTime + totalDays)
Loop
cdDateAddSkipHolidays = startDateTime + totalDays + 1
Else
Do While iteratedDiff < nWorkingDays
totalDays = totalDays + 1
iteratedDiff = cdDateDiffSkipHolidays (startDateTime, startDateTime + totalDays)
Loop
cdDateAddSkipHolidays = startDateTime + totalDays
End If

End Function
amami 2004-08-19
  • 打赏
  • 举报
回复
给你参考,从别地看到的,自己也没看过!
Function cdDateAddSkipWeekends (nNonWeekendDays As Number, startDateTime As DateTime) As DateTime

'结果 = startDateTime + nNonWeekendDays + nWeekendDays
'下面的算法在 nNonWeekendDays 为负时也适用

Dim totalDays
'给出总天数的大致上界。每出现 5 个非周末天,就会有 7
'天。额外的周末 2 天也包括在内,以算作不完整的一周。
totalDays = Fix(nNonWeekendDays * 7 / 5 + 1) + 2

Do While cdDateDiffSkipWeekends (startDateTime, startDateTime + totalDays) >= nNonWeekendDays
totalDays = totalDays - 1
Loop

cdDateAddSkipWeekends = startDateTime + totalDays + 1

End Function
rockrabbit 2004-08-19
  • 打赏
  • 举报
回复
早些时候,增经做过,给一个建议:

法定节假日放到数据库里面(或者文件里面),方便维护。不过一般来说,法定节假日并不经常变动。

这样,用一个SQL Server存储过程或者函数是最方便的了。基本上,一句SQL就出来了。
happyno7 2004-08-19
  • 打赏
  • 举报
回复
哈哈,我给一个最搞笑的实现方法:
在你的数据库里面自己建一张50年甚至100年的年历表,里面的节假日你可以自己定义
然后,想怎么计算就可以怎么计算了。
darkm00n 2004-08-19
  • 打赏
  • 举报
回复
数据库中函数:
set @_ReturnValue = datediff(day,dt1,dt2)-(datediff(week,dt1,dt2))*2
if datename(weekday,dt1)<> '星期日'
set @_ReturnValue = @_ReturnValue +1

if datename(weekday,dt2)= '星期六'
set @_ReturnValue = @_ReturnValue -1

return @_ReturnValue
jamesfay 2004-08-19
  • 打赏
  • 举报
回复
SQL Server: Select datediff(day, '2004/07/01', '2004/07/20')
C#: int DateDiff = ((TimeSpan)(dt1 - dt2)).Days;
孟子E章 2004-08-19
  • 打赏
  • 举报
回复
这个的确麻烦,不但要考虑阳历,还要考虑阴历春节等,因此,必须写函数了
  • 打赏
  • 举报
回复
2。14情人节也算节假日,看你怎么算。烦死你
vzxq 2004-08-19
  • 打赏
  • 举报
回复
如果做的没有BUG没那么容易啊
rockrabbit 2004-08-19
  • 打赏
  • 举报
回复
晕死。
这个怎么算都能出来的。另外,法定节假日也要考虑。
jb2008 2004-08-19
  • 打赏
  • 举报
回复
有答案了吗?
jb2008 2004-08-17
  • 打赏
  • 举报
回复
"2004-8-17 16:53:30" 与 "2004-9-1 14:50:48"
应该有 14 天,10个工作日,大家检测一下.
zxkid 2004-08-17
  • 打赏
  • 举报
回复
SQL Server 2000:

CREATE PROCEDURE WorkDays
@dt1 datetime, @dt2 datetime, @wd int output
as
declare @days int
set @days=0
set @wd=0
while (dateadd(day, @days, @dt1) <= @dt2)
begin
if datepart(weekday,dateadd(day, @days, @dt1)) not in (1,7)
set @wd=@wd+1
set @days=@days+1
end
return @wd


declare @dt1 datetime,@dt2 datetime,@wd int
set @dt1='2004/07/10'
set @dt2='2004/08/10'
set @wd=0
exec WorkDays @dt1, @dt2, @wd output
select @wd
egxsun 2004-08-17
  • 打赏
  • 举报
回复
sjc0(流浪者) 得到的也是相差的天数
lglesias 2004-08-17
  • 打赏
  • 举报
回复
例如本月的14-29号
共16天
结果是6天休息日
最主要的是不知道是周几
你们是怎么处理这块的啊
lglesias 2004-08-17
  • 打赏
  • 举报
回复
要不就是差是7的几倍就减去几倍的2
加载更多回复(15)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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