SQL Server 使用case语句在SQL中计算开始日期和结束日期之间的日期

m1m5dgzv  于 2023-02-03  发布在  其他
关注(0)|答案(1)|浏览(175)

我希望计算到(DateTime)时间跨度之间重叠的天数。
这个问题背后的逻辑是:囚犯正在服刑,从"初始床位开始"(刑期开始)到"床位结束日期"(刑期结束)。在服刑期间,他因任何原因休假......我们的想法是计算特定囚犯服刑期间休假的天数,作为示例。
确保休假开始和结束日期介于床位开始和结束日期之间,然后计算日期差并忽略其余日期。
根据现有数据:
| 原始_床_开始|原始_床_结束|离开开始日期|休假结束日期|休假天数|
| - ------|- ------|- ------|- ------|- ------|
| 2022年10月19日09时21分00秒|2022年11月2日14时49分00秒|2022年10月28日00时00分|2022年11月2日00时00分00秒|??|
| 2022年11月2日14时50分00秒|2022年11月16日13时19分|2022年10月28日00时00分|2022年11月2日00时00分00秒|??|
| 2022年12月19日10时17分|2022年12月27日10时59分00秒|2022年12月19日00时00分|2022年12月30日上午00时00分00秒|??|
| 2022年12月27日11时00分00秒|零|2022年12月19日00时00分|2022年12月30日上午00时00分00秒|??|
| 2022年12月22日20时29分|2022年12月29日17时48分00秒|2022年12月26日00时00分|2022年12月30日上午00时00分00秒|??|
| 2022年12月29日17时49分|2022年12月30日14时59分00秒|2022年12月26日00时00分|2022年12月30日上午00时00分00秒|??|
我希望结果集为:
| 原始_床_开始|原始_床_结束|离开开始日期|休假结束日期|休假天数|
| - ------|- ------|- ------|- ------|- ------|
| 2022年10月19日09时21分00秒|2022年11月2日14时49分00秒|2022年10月28日00时00分|2022年11月2日00时00分00秒|五个|
| 2022年11月2日14时50分00秒|2022年11月16日13时19分|2022年10月28日00时00分|2022年11月2日00时00分00秒|无|
| 2022年12月19日10时17分|2022年12月27日10时59分00秒|2022年12月19日00时00分|2022年12月30日上午00时00分00秒|八个|
| 2022年12月27日11时00分00秒|零|2022年12月19日00时00分|2022年12月30日上午00时00分00秒|三个|
| 2022年12月22日20时29分|2022年12月29日17时48分00秒|2022年12月26日00时00分|2022年12月30日上午00时00分00秒|四个|
| 2022年12月29日17时49分|2022年12月30日14时59分00秒|2022年12月26日00时00分|2022年12月30日上午00时00分00秒|无|
这是我最接近

CASE 
    WHEN (CONVERT(DATE, LEAVE_START_DATE) >= CONVERT(DATE, ORIG_BED_START) AND 
          CONVERT(DATE, LEAVE_START_DATE) <= CONVERT(DATE, ORIG_BED_END)) 
         OR (CONVERT(DATE, LEAVE_END_DATE) >= CONVERT(DATE, ORIG_BED_END) AND CONVERT(DATE, LEAVE_END_DATE) <= CONVERT(DATE, ORIG_BED_END))
        THEN DATEDIFF(DAY, LEAVE_START_DATE, LEAVE_END_DATE)
        ELSE ''
END AS LEAVE_DAYS
x7yiwoj4

x7yiwoj41#

要评估的数学公式为MAX(0,MIN(起始床位结束日期,离开结束日期)- MAX(起始床位开始日期,离开开始日期)),在SQL中应给予:

greatest(0, trunc( convert(date,least(coalesce(orig_bed_end,leave_end_date),leave_end_date)) - convert(date,greatest(orig_bed_start,leave_start_dat))))

根据您放置trunc的位置(在计算差值之前或之后),您可能会得到略微不同的结果(+-1)。
(从ORACLE语法快速转换而来,因此可能仍需要修复才能在SQLServer中工作)

相关问题