Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MYSQL和UNION中生成日期范围_Mysql_Join_Union - Fatal编程技术网

在MYSQL和UNION中生成日期范围

在MYSQL和UNION中生成日期范围,mysql,join,union,Mysql,Join,Union,我正在尝试根据预定义的日期生成报告。我有两张桌子,进进出出和加班 进出台 加班表 预期结果 使用UNION,它可以将日期加倍,但这可以通过分组来解决,但分组似乎不在UNION中工作 P>和棘手的部分是显示空白6月1日和5月1日。我需要显示这是因为它的时间表报告。< /P> 任何帮助或线索都将不胜感激 代码: 如果我能理解这个问题,像这样的事情应该可以满足你的要求: SELECT n.date, n.emp_id, n.in, n.out, o.minutes FROM normal n JO

我正在尝试根据预定义的日期生成报告。我有两张桌子,进进出出和加班

进出台

加班表

预期结果

使用UNION,它可以将日期加倍,但这可以通过分组来解决,但分组似乎不在UNION中工作

<> P>和棘手的部分是显示空白6月1日和5月1日。我需要显示这是因为它的时间表报告。< /P> 任何帮助或线索都将不胜感激

代码:


如果我能理解这个问题,像这样的事情应该可以满足你的要求:

SELECT n.date, n.emp_id, n.in, n.out, o.minutes
FROM normal n 
JOIN overtime o USING(emp_id)
WHERE n.date BETWEEN '2012-01-01' AND '2012-01-10'
请记住,如果要显示没有匹配项的日期,则必须创建一个包含此日期列表的表:

日期 然后,您可以通过以下方式更改查询以获得所需的结果集:

SELECT d.timestamp AS date, b.emp_id, b.in, b.out, b.minutes
FROM dates d
LEFT JOIN 
(SELECT n.date AS timestamp, n.emp_id AS emp_id, n.in AS in, n.out AS out, o.minutes AS minutes
 FROM normal n 
 JOIN overtime o USING(emp_id)
 ) b 
 USING(timestamp)
 WHERE d.timestamp BETWEEN '2012-01-01' AND '2012-01-10'
如果要避免使用dates表,可以尝试使用此更复杂的查询,则应提供相同的结果,而不需要第三个存储日期范围的表:

SELECT d.timestamp AS date, b.emp_id, b.in, b.out, b.minutes
FROM ( 
SELECT '2012-01-01' + INTERVAL a + b DAY AS timestamp
FROM
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
UNION SELECT 8 UNION SELECT 9 ) d,
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 
UNION SELECT 30 UNION SELECT 40) m
WHERE '2012-01-01' + INTERVAL a + b DAY  <  '2012-01-11'
ORDER BY a + b
) d
LEFT JOIN 
(SELECT n.date AS timestamp, n.emp_id AS emp_id, n.in AS in, n.out AS out, o.minutes AS minutes
 FROM normal n 
 JOIN overtime o USING(emp_id)
 ) b 
 USING(timestamp)

如果我能理解这个问题,像这样的事情应该可以满足你的要求:

SELECT n.date, n.emp_id, n.in, n.out, o.minutes
FROM normal n 
JOIN overtime o USING(emp_id)
WHERE n.date BETWEEN '2012-01-01' AND '2012-01-10'
请记住,如果要显示没有匹配项的日期,则必须创建一个包含此日期列表的表:

日期 然后,您可以通过以下方式更改查询以获得所需的结果集:

SELECT d.timestamp AS date, b.emp_id, b.in, b.out, b.minutes
FROM dates d
LEFT JOIN 
(SELECT n.date AS timestamp, n.emp_id AS emp_id, n.in AS in, n.out AS out, o.minutes AS minutes
 FROM normal n 
 JOIN overtime o USING(emp_id)
 ) b 
 USING(timestamp)
 WHERE d.timestamp BETWEEN '2012-01-01' AND '2012-01-10'
如果要避免使用dates表,可以尝试使用此更复杂的查询,则应提供相同的结果,而不需要第三个存储日期范围的表:

SELECT d.timestamp AS date, b.emp_id, b.in, b.out, b.minutes
FROM ( 
SELECT '2012-01-01' + INTERVAL a + b DAY AS timestamp
FROM
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
UNION SELECT 8 UNION SELECT 9 ) d,
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 
UNION SELECT 30 UNION SELECT 40) m
WHERE '2012-01-01' + INTERVAL a + b DAY  <  '2012-01-11'
ORDER BY a + b
) d
LEFT JOIN 
(SELECT n.date AS timestamp, n.emp_id AS emp_id, n.in AS in, n.out AS out, o.minutes AS minutes
 FROM normal n 
 JOIN overtime o USING(emp_id)
 ) b 
 USING(timestamp)

看到这里了吗?这是一个MySQL/perl的答案,但原理是一样的。谢谢这个链接在我的其他问题上帮助了我很多:看到这里了吗?这是一个MySQL/perl的答案,但原理是一样的。谢谢这个链接帮助我解决了很多其他问题: