使用自定义日历之间的多行日期

时间:2013-12-12 20:01:58

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

所以我的头靠在墙上,看不到木头的树木......

我有两张桌子; 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

表_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 01/01/2013 03/01/2013 2     456 02/01/2013 08/01/2013 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

用于生成已填充示例表的代码;

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

删除表格的代码;

DROP TABLE#table_1 DROP TABLE#table_2;

感谢所有人提前帮助:)

1 个答案:

答案 0 :(得分:0)

试试这个:

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和workday标志列AND我们在第二个表中为每个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.

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

希望这有点帮助...