[SQL难题:计算连续5天以上的日期]

雷肿么了 2011-05-24 11:41:20

SQL 问题:
有张请假表A(工号,日期),假日表B(日期,节日名称)
请假N天,就有N条数据但不包含表B节假日的日期,礼拜天(可能有,也可能没有)
怎么计算表A中连续请假5天以上的员工,还包含跨月的情况。
//例如: 周四,周五,周六,周日,下周一 属于连续5天的数据
//例如: 周三,周四,周五,周六,下周一 这种也属于连续5天的数据


--下面例出表A所有情况:
--例1 (当月连续请假6天以上):
卡号 日期
213380 2011-05-05 00:00:00
213380 2011-05-06 00:00:00
213380 2011-05-07 00:00:00
213380 2011-05-08 00:00:00 --有时可能也会有星期天的日期
213380 2011-05-09 00:00:00
213380 2011-05-10 00:00:00


--例2 (当月连续请假5天,2011-04-10 属于星期天):
卡号 日期
201105 2011-04-08 00:00:00
201105 2011-04-09 00:00:00
201105 2011-04-11 00:00:00
201105 2011-04-12 00:00:00
201105 2011-04-13 00:00:00

--例3 (当月连续请假4天,):
卡号 日期
201166 2011-04-08 00:00:00
201166 2011-04-09 00:00:00
201166 2011-04-11 00:00:00
201166 2011-04-12 00:00:00

--例4 (跨月连续请假4天,假日表B中,5月1,5月2,5月3属于假日):
卡号 日期
201177 2011-04-29 00:00:00
201177 2011-04-30 00:00:00
201177 2011-05-04 00:00:00
201177 2011-04-05 00:00:00

--例5 (跨月连续请假5天,假日表B中,5月1,5月2,5月3属于假日):
卡号 日期
201177 2011-04-29 00:00:00
201177 2011-04-30 00:00:00
201177 2011-05-04 00:00:00
201177 2011-05-05 00:00:00
201177 2011-05-06 00:00:00


--表B 数据
日期 节日名称
2011-04-05 00:00:00 清明节
2011-05-01 00:00:00 劳动节
2011-05-02 00:00:00 劳动节
2011-05-03 00:00:00 劳动节


...全文
713 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hqn258 2011-05-25
  • 打赏
  • 举报
回复
这个题目还真的有点难
雷肿么了 2011-05-24
  • 打赏
  • 举报
回复
--忘记补充了,是数据库是SQL2000
雷肿么了 2011-05-24
  • 打赏
  • 举报
回复
回楼上, 这里只须处理周日,还有节假日的问题。

因为周日有时上班,有时又不上班,周六是一定要上班的。除非是假日期间。
中国风 2011-05-24
  • 打赏
  • 举报
回复
周六周日也需要連續?

如:周5 下周1 --這周六日休息,算不算連續?
中国风 2011-05-24
  • 打赏
  • 举报
回复
把工作日期生成臨時表連接得到記錄數就行了
shizhengzz 2011-05-24
  • 打赏
  • 举报
回复
嗯 可以的! 加q 415552548
cento123 2011-05-24
  • 打赏
  • 举报
回复
1)要建一个节假日日期表
2)。。。还没想好
雷肿么了 2011-05-24
  • 打赏
  • 举报
回复
顶下,,别沉了。。
快溜 2011-05-24
  • 打赏
  • 举报
回复
楼下加油。
--小F-- 2011-05-24
  • 打赏
  • 举报
回复
这个题目还真的有点难
florence31 2011-05-24
  • 打赏
  • 举报
回复
--这里表创建用一下楼上的呵呵
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([卡号] int,[日期] Datetime)
Insert #A
select 213380,'2011-05-05' union all
select 213380,'2011-05-06' union all
select 213380,'2011-05-07' union all
select 213380,'2011-05-08' union all
select 213380,'2011-05-09' union all
select 213380,'2011-05-10'
Go

--> -->

if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([日期] Datetime,[节日名称] nvarchar(3))
Insert #B
select '2011-04-05',N'清明节' union all
select '2011-05-01',N'劳动节' union all
select '2011-05-02',N'劳动节' union all
select '2011-05-03',N'劳动节'
Go

if not object_id(N'Tempdb..temp10') is null
drop table temp10
Create table temp10 ([卡号] nvarchar(50),[5天连续休假次数] int)



declare @id nvarchar(50),
@amount as int,
@begintime as datetime,
@enddate as datetime





declare aaa cursor
for

select [卡号],min([日期]) as begindate,max([日期])as enddate from #A
group by [卡号]



open aaa
fetch next from aaa into @id,@begintime,@enddate
while (@@fetch_status=0)
begin

set @amount = 0


while @begintime <= @enddate
begin

if @begintime in (select [日期] from #A where [卡号] = @id )
begin

set @amount = @amount+1

end

if @begintime not in (select [日期] from #A where [卡号] = @id ) and @begintime not in (select [日期] from #B )
begin

set @amount = 0

end

if @amount = 5
begin

if not exists (select 1 from temp10 where @id= [卡号])
begin

insert into temp10
select @id , 1

end
else
begin

update temp10
set [5天连续休假次数] = [5天连续休假次数] + 1

end

set @amount = 0
end



set @begintime = @begintime+1
end


print @amount





fetch next from aaa into @id,@begintime,@enddate
end
close aaa
deallocate aaa


select * from temp10






ly745455 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 z307755214 的回复:]
谢谢楼上各位 亲。。
[/Quote]
美女????
雷肿么了 2011-05-24
  • 打赏
  • 举报
回复
谢谢楼上各位 亲。。
florence31 2011-05-24
  • 打赏
  • 举报
回复
这个我帮客户做过实际案例,首先是否只是判断一年当中是否只要判断是否有连续5天请假情况?是否要统计超过5天的次数呢?如果需要,那么问题来了,超过10天的连续休假算几次?如果连续100天请假是否只算一次?当然以上2种都有办法写。

我写个大概给你看看。
shinesky 2011-05-24
  • 打赏
  • 举报
回复
MARK﹐學習中....
中国风 2011-05-24
  • 打赏
  • 举报
回复
寫一個給樓主參照,看看結果是否正確?有時間時再想想應該有更好的方法實現
use Tempdb
go
--> -->

if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([卡号] int,[日期] Datetime)
Insert #A
select 213380,'2011-05-05' union all
select 213380,'2011-05-06' union all
select 213380,'2011-05-07' union all
select 213380,'2011-05-08' union all
select 213380,'2011-05-09' union all
select 213380,'2011-05-10'
Go

--> -->

if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([日期] Datetime,[节日名称] nvarchar(3))
Insert #B
select '2011-04-05',N'清明节' union all
select '2011-05-01',N'劳动节' union all
select '2011-05-02',N'劳动节' union all
select '2011-05-03',N'劳动节'
Go



SELECT TOP 365 ID=IDENTITY(INT,0,1) INTO # FROM syscolumns AS a,syscolumns AS b ,syscolumns AS c


DECLARE @Date DATETIME

SET @Date='2011-01-01' --開始日期


SELECT
TOP 365 @Date+ID AS Date,Flag=CAST(null AS TINYINT)
INTO #C
FROM #
WHERE @Date+ID<=GETDATE()




--SELECT @@DATEFIRST 為7時
SELECT
ID=IDENTITY(INT,1,1),c2.卡号,c2.Date, Flag=CASE WHEN a.日期 IS NOT null THEN 1 END
INTO #C2
FROM (SELECT Date,卡号,Flag FROM #C,(SELECT DISTINCT 卡号 FROM #A) AS d) AS c2
LEFT JOIN #B AS b ON c2.Date=b.日期
LEFT JOIN #A AS a ON a.卡号=c2.卡号 AND c2.Date=a.日期
WHERE NOT(a.日期 IS NULL AND (DATEPART(dw,Date)=1 OR b.日期 IS NOT NULL))
ORDER BY c2.Date

SELECT *
FROM #C2 AS b
WHERE EXISTS(
SELECT *
FROM #C2 AS a
WHERE a.卡号=b.卡号 AND ABS(a.ID-b.ID)<=2 AND
EXISTS(SELECT 1 FROM #C2 WHERE 卡号=a.卡号 AND ABS(a.ID-ID)<=2 HAVING SUM(Flag)=5)
)



DROP TABLE #,#C,#C2
gogodiy 2011-05-24
  • 打赏
  • 举报
回复
周六还要上班啊,这个公司好扣~~~
jxqn_liu 2011-05-24
  • 打赏
  • 举报
回复
连续的这个很难搞定,周一,周二,周三,周四,周五,周六,周日,下周一 从任意一个星期开始有5天连续的也都算是连续数,这样就木有有一个基准点

34,874

社区成员

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

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