求各位大侠出手解决这个数据运算

化境者 2013-09-23 06:04:58
有如下数据

开始日期 结束日期 天数
2013-1-1 2013-3-1 5
2013-1-5 -3
2013-4-1 -5

凡是正数的在结束日期之前有效,超过结束日期视为零。而负天数没有结束日期的限制。负数的开始日期在正数的结束日期之前可以相抵。5+-3=2 第三条记录的开始日期在结束日期之后所以变成0+-5=-5最终结果是-5。

各位大侠有没有好的建议!!
...全文
254 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
化境者 2013-10-10
  • 打赏
  • 举报
回复
小弟学得少!能解释下递归过程么。
trs666666 2013-09-27
  • 打赏
  • 举报
回复
创建表的代码
create table TEXT2
(
SDATE datetime,
EDATE datetime,
num int)
自己将数据导入进去 下面是结果代码
WITH CTE_T1 AS(
	select * from TEXT2 where EDATE IS NULL)
,CTE_T2	 AS(
	select * from TEXT2 where EDATE IS NOT NULL
	union all
	select MAX(SDATE)SDATE,MAX(SDATE)EDATE,0 NUM from TEXT2)
,CTE_T3	 AS(
	select A.*,B.EDATE EDATE2 from CTE_T2 A 
	 left  join CTE_T2 B on A.EDATE>B.EDATE)
,CTE_T4	 AS(
	select *,row_number() over(partition by SDATE ORDER BY EDATE2 desc) ID from CTE_T3)
,CTE_T5	 AS(
	select * from CTE_T4 where ID=1)
,CTE_T6	 AS(
	select A.*,isnull(B.NUM,0) NUM2 from CTE_T5 A
	left join CTE_T1 B ON A.EDATE>=B.SDATE and (A.EDATE2<B.SDATE or A.EDATE2 is null))
,CTE_T7	 AS(
	select SDATE,EDATE,NUM,SUM(NUM2) NUM2 FROM CTE_T6 group by SDATE,EDATE,NUM)
,CTE_T8	 AS(
	select SDATE,EDATE,case when NUM+NUM2>0 and NUM2<0 then 0 else NUM+NUM2 end NUM from CTE_T7)
select sum(num) 剩余天数 from CTE_T8
Wudaode 2013-09-27
  • 打赏
  • 举报
回复
引用 2 楼 lincanjin 的回复:
看上面的图片!刚才发的都粘在一起了。
引用 16 楼 lincanjin 的回复:
我要得到-5
select 天数 from tableName where 结束日期='2013-3-1' 我不知道原数据是什么。只能这么回答啦,希望你满意! 或者 select -5
Wudaode 2013-09-26
  • 打赏
  • 举报
回复
能不能简单点儿 原始数据时12345 希望得到的数据时54321 这不就得了,你那问题,我反反复复看了几次,都不知道你问什么!
Wudaode 2013-09-26
  • 打赏
  • 举报
回复
引用 12 楼 lincanjin 的回复:
天数为正的表示公司欠员工的假,天数为负的是员工欠公司的(也就是提前休假,可以在休息日上班还给公司)
你还是在解释上面的数据时什么意思,但是我还是不知道你问什么问题!
化境者 2013-09-26
  • 打赏
  • 举报
回复
天数为正的表示公司欠员工的假,天数为负的是员工欠公司的(也就是提前休假,可以在休息日上班还给公司)
Wudaode 2013-09-26
  • 打赏
  • 举报
回复
说了一大串,我貌似弄懂了,上面每条数据代表什么意思了,但是,你问的啥问题?要得到什么结果?
化境者 2013-09-26
  • 打赏
  • 举报
回复
我要得到-5
化境者 2013-09-26
  • 打赏
  • 举报
回复
我要得到-5
PB菜鸟 2013-09-25
  • 打赏
  • 举报
回复
先搞清楚自己的需求算法,根据算法再进行日期的比较。
化境者 2013-09-25
  • 打赏
  • 举报
回复
大家能看明白么。
化境者 2013-09-25
  • 打赏
  • 举报
回复
这是一个假期计算的程序!正数是公司的补休假期(例如法定假为公司加班都登记为正数)!但是公司要求在规定时间把假休完否则当0处理(即超过结束日正数都为0)。负数是员工已休假。员工可以先休后补或将未休假休完。负数没有有效期只要有欠公司的就会一直欠着直到有假期补上为止。最终的结果是要统计出到某个日期时结的休假天数。 按照上面给出的数据计算结果是-5天(直接计算到2013-5-1时有多少假期)。 分析: 第一条记录是员工加班攒下的5天休息时间,有效期到 2013-3-1。 第二条记录是员工从开始日期连休3天,而开始日在第一条记录的有效期内,5+-3=2。 第三条记录是员工再次连休5天,上次剩下的2已经过了有效期所以为0,0+-5=-5,最终结果是-5
--小F-- 2013-09-25
  • 打赏
  • 举报
回复
需要得到的结果是什么? 也列一个出来 顺便多给点数据。
chen357313771 2013-09-25
  • 打赏
  • 举报
回复
这是要做什么对比吗,没看明白啊
化境者 2013-09-24
  • 打赏
  • 举报
回复
自己顶起!望高手能看到
化境者 2013-09-23
  • 打赏
  • 举报
回复
目的是要计算欠了多少天(也就是负数)!难在负数没有时限!而正数却有。
huajiongyu 2013-09-23
  • 打赏
  • 举报
回复
最终目的是要做什么?
化境者 2013-09-23
  • 打赏
  • 举报
回复

看上面的图片!刚才发的都粘在一起了。
Andy__Huang 2013-09-23
  • 打赏
  • 举报
回复
看不太明白意思?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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