【问题标题】:Multiple rows of dates between using custom calendar使用自定义日历之间的多行日期
【发布时间】:2024-01-18 08:39:01
【问题描述】:

我的头撞在墙上,只见树木不见树林......

我有两张桌子; 1. ID 字段、开始日期和结束日期列。 2. 日期和工作日列。

我只需要能够使用第二个日历上的这个日期来计算每一行两者之间的天数。 Googl'ing 发现了很多没有日期表的示例,以及很多仅基于 1 个开始和结束日期的示例。

Table_1 - 包含每个 id 的条目

id          start_date      end_date
123         01/01/2013     03/01/2013
456         02/01/2013     08/01/2013
789         06/01/2013     07/01/2013

Table_2 - 包含每天的条目

  e_day         workday
01/01/2013         1
02/01/2013         0
03/01/2013         1
04/01/2013         1
05/01/2013         0
06/01/2013         1
07/01/2013         0
08/01/2013         0

结果 id start_date end_date days_between 123 2013 年 1 月 1 日 2013 年 3 月 1 日 2 456 2013 年 2 月 1 日 2013 年 8 月 1 日 3 789 06/01/2013 07/01/2013 1

我可以找出 1 个 id 的值;

SELECT COUNT(workday) FROM table_2
WHERE workday = 1 AND cal_day >= '01/01/2013' 
AND cal_day <= '03/01/2013';

只是不确定如何将此逻辑放入 table_1。 IE(显然不正确)

SELECT 
table_1.id, 
table_1.start_date, 
table_1.end_date,
(COUNT(table_2.workday) FROM table_2 WHERE table_2.workday = 1
AND table_2.e_day >= table_1.start_date 
AND table_2.e_day <= table_2.end_date) AS days_between
FROM table_1

生成bodged示例表的代码;

CREATE TABLE #table_1(id INT, start_date SMALLDATETIME, end_date SMALLDATETIME);
CREATE TABLE #table_2(e_day SMALLDATETIME, workday BIT);

INSERT #table_1 VALUES (123,'01/01/2013','03/01/2013')
INSERT #table_1 VALUES (456,'02/01/2013','08/01/2013')
INSERT #table_1 VALUES (789,'06/01/2013','07/01/2013')

INSERT #table_2 VALUES ('01/01/2013',1)
INSERT #table_2 VALUES ('02/01/2013',0)
INSERT #table_2 VALUES ('03/01/2013',1)
INSERT #table_2 VALUES ('04/01/2013',1)
INSERT #table_2 VALUES ('05/01/2013',0)
INSERT #table_2 VALUES ('06/01/2013',1)
INSERT #table_2 VALUES ('07/01/2013',0)
INSERT #table_2 VALUES ('08/01/2013',0)

SELECT * FROM #table_1
SELECT * FROM #table_2

删除表格的代码;

删除表#table_1 删除表#table_2;

提前感谢大家的帮助:)

【问题讨论】:

    标签: sql tsql date calendar sql-server-2000


    【解决方案1】:

    试试这个:

    select a.id,a.start_date,a.end_date,sum(cast(workday as tinyint)) as NumWorkDays,
               count(*) as Total_days
    from idTable a
    join workdaytable b on b.eday between a.start_date and a.end_Date
    group by a.id,a.start_date,a.end_date
    

    可视化正在发生的事情

    select a.id,a.start_date,a.end_date   
    where id=123
    
    id    start_date   end_date
    123   1/1/2013     3/1/2013
    

    为 id=123 返回一行

    现在,当我们进行连接时,我们添加 e_day 和工作日标志列,并为第二个表中的每个 e_day 添加一行

    id    start_date   end_date    e_day   work_day
    123   1/1/2013     3/1/2013    1/1/2013       0
    123   1/1/2013     3/1/2013    1/2/2013       1
    123   1/1/2013     3/1/2013    1/3/2013       1
    etc.
    

    现在我们有一个大“表”,在 2013 年 1 月 1 日到 2013 年 3 月 1 日之间的第二个表中每天有 5 列和一行。 Sum 操作只是从我们通过连接创建的“表”中添加所有 work_day 标志。如果您在没有 JOIN 的情况下运行查询(并删除总和和计数),您可以看到创建的“表”...

    希望这会有所帮助...

    【讨论】:

    • 您需要将工作日转换为 int 才能使用。
    • 我不得不承认我并不完全理解这一点,但它完全按照要求进行。谢谢!
    • 谢谢 Sparky。找到答案,我现在什至明白了!非常感谢您的帮助。
    最近更新 更多