有个比较复杂的sql问题,简单描述下业务场景,一般查以周为单位的数据,分跨月和不跨月两种情况

sql server

日期是你传入的两个参数:开始和结束日期

我来具体描述下情况,一般查以周为单位的数据,取数周期分为跨月和不跨月,举个栗子

不跨月:2022.05.23-2022.5.29  共7天,都在五月内,那么计算方式为 7/31*26

跨月:2022.05.30-2022.05.05 共7天,2天在5月,5天在6月,那么计算方式为2/31*26+5/30*25

这个26和25,是当月应出勤天数

现在的情况就有点复杂,我的问题就是怎么来分情况查询

好像应该可以用帆软数据集里面使用if来查询,但是我不会,想请问下各位大佬

问题已解决

这是其中的一种解决方案,有需要的朋友可以参考下

image.png

猫头鹰的头 发布于 2022-5-30 15:44 (编辑于 2022-5-30 18:26)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
Z4u3z1Lv6专家互助
发布于2022-5-30 15:46(编辑于 2022-5-30 16:21)

oracle?SqlServer?mysql?

DECLARE @RQ1_ DATE,@RQ2_ DATE

set @RQ1_='2022-05-30'

set @RQ2_='2022-06-05'

SELECT (CASE WHEN DATEPART(YEAR,@RQ1_)=DATEPART(YEAR,@RQ2_) AND DATEPART(MONTH,@RQ1_)=DATEPART(MONTH,@RQ2_) THEN 7*1.0/DAY( DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,-(DAY(@RQ1_)-1),@RQ1_))))*26 ELSE ((DATEDIFF (DAY,@RQ1_,DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,-(DAY(@RQ1_)-1),@RQ1_)))))+1)*1.0/DAY( DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,-(DAY(@RQ1_)-1),@RQ1_))))*26 + (7-((DATEDIFF (DAY,@RQ1_,DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,-(DAY(@RQ1_)-1),@RQ1_)))))+1))*1.0/DAY( DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(DAY,-(DAY(@RQ1_)-1),@RQ1_))))*25  END)

image.png

image.png

  • 猫头鹰的头 猫头鹰的头(提问者) sql server
    2022-05-30 15:48 
  • Z4u3z1 Z4u3z1 回复 猫头鹰的头(提问者) 这个日期是你传入的两个参数:开始和结束日期?
    2022-05-30 15:49 
  • 猫头鹰的头 猫头鹰的头(提问者) 回复 Z4u3z1 是的,日期就是 日期字段 between 开始 and 结束
    2022-05-30 15:52 
  • Z4u3z1 Z4u3z1 回复 猫头鹰的头(提问者) 参考上面的语句 把@RQ1_ @RQ2修改成你的参数
    2022-05-30 16:10 
  • Z4u3z1 Z4u3z1 回复 猫头鹰的头(提问者) 不好意思该乘25的乘成26了,已修改
    2022-05-30 16:22 
最佳回答
0
CD20160914Lv8专家互助
发布于2022-5-30 15:48(编辑于 2022-5-30 16:40)

if(left(A5,7)=mid(A5,12,7),7/day(DATEINMONTH(REPLACE(left(a5,10),".","-"),-1))*26,

((DATESUBDATE(DATEINMONTH(replace(left(a5,7)+"-01",".","-"),-1),replace(left(a5,10),".","-"),"d")+1)/day(DATEINMONTH(REPLACE(left(a5,10),".","-"),-1))*26)

+((7-(DATESUBDATE(DATEINMONTH(replace(left(a5,7)+"-01",".","-"),-1),replace(left(a5,10),".","-"),"d")+1))/day(DATEINMONTH(REPLACE(mid(a5,12,10),".","-"),-1))*25))

image.png

  • 猫头鹰的头 猫头鹰的头(提问者) 这个26和25,是当月应出勤天数,这个我想到怎么解决了,现在就是不知道,该怎么区分两种查询情况
    2022-05-30 15:49 
  • CD20160914 CD20160914 回复 猫头鹰的头(提问者) 现在的分周的数据你组合了没有。只是说你想要计算 2/31*26+5/30*25 这种数据?
    2022-05-30 15:52 
  • 猫头鹰的头 猫头鹰的头(提问者) 回复 CD20160914 是的,就是看开始日期与结束日期是否跨月,跨月就是按照你的这个说法来计算,不跨月就简单点
    2022-05-30 15:55 
  • 猫头鹰的头 猫头鹰的头(提问者) 回复 CD20160914 是不是可以判断,month(开始日期)=month(结束日期),不跨月计算方式,跨越计算方式
    2022-05-30 15:56 
  • CD20160914 CD20160914 回复 猫头鹰的头(提问者) 跨月的可以判断。稍等我写一个公式
    2022-05-30 16:05 
最佳回答
0
用户W4933403Lv5初级互助
发布于2022-5-30 16:13

不跨月算法

where month('${开始日期}')=month'${结束日期}')

union all

跨月算法

where month('${开始日期}')<>month'${结束日期}')

我的大概思路是这样子的

  • 猫头鹰的头 猫头鹰的头(提问者) 你这个思路我是明白的,但好像不满足业务的需求,你可以看看我和楼上的两位大哥的分享,均可以实现实际业务需求
    2022-05-30 18:27 
  • 4关注人数
  • 562浏览人数
  • 最后回答于:2022-5-30 18:26
    请选择关闭问题的原因
    确定 取消
    返回顶部