在sql server中将日期范围拆分为每月一行

 苗Tinal3 发布于 2023-02-14 04:09
  • php
  • 我有一个表有两列名为"from_date"和"to_date"的表

        the table look like:-
    

    在此输入图像描述

    我想要的结果如下: -

    from_date            to_date   
    -----------         ------------  
    2013-11-25           2013-11-30
    2013-12-01           2013-12-05
    

    该日期从2013-11-25分为2013-11-30,另一个日期从2013-12-01分到2013-12-05 ......是否有可能像这样分裂?

    1 个回答
    • 这是闰年安全,并处理其他答案目前没有的日期范围.

      DECLARE @d TABLE(from_date DATE, to_date DATE);
      
      INSERT @d VALUES ('2013-11-25','2013-12-05');
      
      ;WITH n(n) AS 
      (
        SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 FROM sys.all_columns
      ),
      d(n,f,t,md,bp,ep) AS 
      (
        SELECT n.n, d.from_date, d.to_date, 
          DATEDIFF(MONTH, d.from_date, d.to_date),
          DATEADD(MONTH, n.n, DATEADD(DAY, 1-DAY(from_date), from_date)),
          DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, n.n, 
            DATEADD(DAY, 1-DAY(from_date), from_date))))
       FROM n INNER JOIN @d AS d 
       ON d.to_date >= DATEADD(MONTH, n.n-1, d.from_date)
      )
      SELECT original_from_date = f, original_to_date = t, 
        new_from_date = CASE n WHEN 0  THEN f ELSE bp END,
        new_to_date   = CASE n WHEN md THEN t ELSE ep END 
      FROM d WHERE md >= n
      ORDER BY original_from_date, new_from_date;
      

      结果:

      original_from_date   original_to_date   new_from_date   new_to_date
      ------------------   ----------------   -------------   -----------
      2013-11-25           2013-12-05         2013-11-25      2013-11-30
      2013-11-25           2013-12-05         2013-12-01      2013-12-05
      

      SQLFiddle演示具有更长的日期范围和闰年

      2023-02-14 04:32 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有