如何将日期交叉加入选择?

时间:2011-07-07 15:36:55

标签: mysql sql excel cross-join

我需要一个查询,该查询将包含日期,用户名和该日期的十二个operation_id之一。例如

operations
"id";"name";
"1";"LASER CUTTING"
"2";"DEBURR"
"3";"MACHINING"
"4";"BENDING"
"5";"PEM"
"6";"WELDING"
"7";"PAINT PREPARATION"
"8";"PAINTING"
"9";"SILKSCREEN PREPARATION"
"10";"SILKSCREEN"
"11";"ASSEMBLY - PACKAGING"
"12";"LASER PREP";

和用户表

bob
jimmeh
jimbo

我在这些表之间有一个交叉连接来得到这样的东西:

bob 1
bob 2
bob 3
bob 4
bob 5
bob 6
bob 7
bob 8
bob 9
bob 10
bob 11
bob 12
jimmeh 1
jimmeh 2
jimmeh 3
jimmeh 4
jimmeh 5
jimmeh 6
jimmeh 7
jimmeh 8
jimmeh 9
jimmeh 10
jimmeh 11
jimmeh 12
jimbo 1
jimbo 2
jimbo 3
jimbo 4
jimbo 5
jimbo 6
jimbo 7
jimbo 8
jimbo 9
jimbo 10
jimbo 11
jimbo 12

但我也想在2011年1月1日到现在之间每天进行交叉加入,以便我可以使用此查询为每个人每天的每个操作记录一次,以便我可以将它放在一个支点表,然后使用它为每个操作的每个用户驱动每周的报告。

截至目前,我有一个来自db.users join操作的简单select userid,其中departmentid = 8

我试过了:

select 
  userid, 
    first_name, 
    last_name,
    operations.id,
    operations.name
from 
  protocase.tblusers 
join
  operations
join
  select (BETWEEN "2011-01-01" and NOW())
where 
  departmentid = 8 and 
    protocase.tblusers.active = 1

类似于如何选择(1,2,3)或其他不是来自桌子的东西,但我似乎无法弄清楚如何选择1月1日到现在之间的所有日期。这甚至可能吗?

2 个答案:

答案 0 :(得分:1)

您可以创建类似此http://www.techrepublic.com/blog/datacenter/simplify-sql-server-2005-queries-with-a-dates-table/326

的日期表

编辑:添加存储过程以生成日期:

DROP PROCEDURE IF EXISTS datePopulate;
DELIMITER $$
CREATE PROCEDURE datePopulate( startDate datetime, numDays int)
BEGIN

declare currDate datetime default startDate;
declare i int default 1;

WHILE (i<=numDays) DO       

    INSERT INTO DateLookup(DateFull, fullYear, weekdayname) 
    VALUES(currDate, date_format(currDate, '%Y'), date_format(currDate, '%a'));
    SET i = i+1;
    SET currDate = DATE_ADD(currDate , INTERVAL 1 DAY);

END WHILE;

END $$
DELIMITER ;

创建过程后,可以像这样调用它:

CALL datePopulate('2011-01-01', 30);

这将填写表格,从2011-01-01开始,为期30天。

我没有在insert语句中添加所有列。使用来自here的信息,应该非常直接地添加。

答案 1 :(得分:1)

最简单的方法是拥有一个预定义的表,其中包含一年中的所有日期,最多为365行。然后,您只需在查询中使用该表,仅选择2011-01-01和NOW()之间的行。这也意味着您的查询必须通过不在每次运行中创建日期表来做较少的工作。

只是另一个想法,虽然我不确定你是否需要这个。如果意图是每年都有一个日期表,例如2012年你想要一个类似的日期表,但是所有日期都是2012年,那么你可能会考虑只存储没有年份的日期和月份。

希望这是有道理的。