Php MySQL选择日期范围内的所有日期,即使当天没有可用数据
我每天都有记录作为打卡时间。我想显示date givens周的所有日期,并显示日期,即使在中找不到该日期的数据 例如:Php MySQL选择日期范围内的所有日期,即使当天没有可用数据,php,mysql,date,Php,Mysql,Date,我每天都有记录作为打卡时间。我想显示date givens周的所有日期,并显示日期,即使在中找不到该日期的数据 例如: Monday 2015-05-04 - 2015-05-04 10:30:00 - 2015-05-04 15:45:34 Tuesday 2015-05-05 - 2015-05-05 08:43:23 - 2015-05-05 17:18:13 Wednesday 2015-05-06 - 2015-05-06 09:03:12 Thursday 2015-05-07
Monday 2015-05-04
- 2015-05-04 10:30:00
- 2015-05-04 15:45:34
Tuesday 2015-05-05
- 2015-05-05 08:43:23
- 2015-05-05 17:18:13
Wednesday 2015-05-06
- 2015-05-06 09:03:12
Thursday 2015-05-07
0 Entries
Friday 2015-05-08
0 Entries
DB架构如下所示:
id | user_id | punch_time | punch_status
理想情况下,我希望能够将MySQL的日期更改为任何时间戳,并显示该周的日期和结果
谢谢:D
新的 你知道为什么在没有记录的日子里这样做是行不通的吗
SELECT * FROM punch_clock, calendar_table WHERE calendar_table.dt = DATE(punch_clock.punch_time) && calendar_table.week_num = $week && calendar_table.y = $year ORDER BY punch_clock.punch_time
更新的查询
SELECT * FROM punch_clock LEFT JOIN calendar_table ON calendar_table.dt = DATE(punch_clock.punch_time) WHERE calendar_table.week_num = 18 && calendar_table.y = 2015;
试试这个:
SELECT *
FROM
(
SELECT a.Date AS mydate
FROM (
SELECT date('2015-05-08') - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date
FROM (SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS a
CROSS JOIN (SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS b
CROSS JOIN (SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS c
) a
WHERE a.Date BETWEEN '2015-05-04' AND '2015-05-08'
) dates
LEFT JOIN
(
SELECT *
FROM
table1
) data
ON DATE_FORMAT(dates.mydate, '%Y%m%d') = DATE_FORMAT(data.punch_time, '%Y%m%d')
SQL Fiddle:
对于您的问题,这是一个快速但不是理想的解决方案。但我认为它已经足够使用了
如果您想“完美地”解决这个问题,我建议您阅读这篇文章:对于MySQL,我通常使用一个日历表(例如包含2030年之前的所有日期)
它允许做很多其他的事情,比如这种查询,管理特殊的日子,等等 您需要
左键连接您的表,我的意思是此日历表必须“左键定位”
接受您的最后一个查询,我会这样做:
选择*
从日历作为cal
左连接打孔时钟作为临时市政局
日期(cal.dt=日期(临市局打卡时间))
哪里是真的
和cal.week_num=18
和cal.y=2015
;
没有尝试,但这是一个想法。即使这是一个非常古老的问题,我也不喜欢额外的日历表的想法,于是提出了这个查询,并针对这个问题进行了调整
SELECT pc.`id`, pc.`user_id`, pc.`punch_status`, dates.`date` FROM punch_clock pc RIGHT JOIN (SELECT week.`date` FROM (
SELECT CURDATE() AS `date`
UNION SELECT CURDATE() + INTERVAL 1 DAY
UNION SELECT CURDATE() + INTERVAL 2 DAY
UNION SELECT CURDATE() + INTERVAL 3 DAY
UNION SELECT CURDATE() + INTERVAL 4 DAY
UNION SELECT CURDATE() + INTERVAL 5 DAY
UNION SELECT CURDATE() + INTERVAL 6 DAY
UNION SELECT CURDATE() - INTERVAL 1 DAY
UNION SELECT CURDATE() - INTERVAL 2 DAY
UNION SELECT CURDATE() - INTERVAL 3 DAY
UNION SELECT CURDATE() - INTERVAL 4 DAY
UNION SELECT CURDATE() - INTERVAL 5 DAY
UNION SELECT CURDATE() - INTERVAL 6 DAY
) AS week
WHERE YEARWEEK(`date`, 0) = YEARWEEK(CURDATE(), 0)) AS dates ON dates.`date` = DATE(pc.`punch_time`) ORDER BY dates.`date`
不太漂亮,但它不需要额外的桌子就能完成任务。这使用从周一到周日的一周,使用YEARWEEK(xxx,1)
表示从周日到周一的一周 桌子的结构是什么?您尝试过什么?尝试获取所需范围内的所有数据并按日期排序。然后用phpAnd循环它,你尝试了什么查询?你需要一个日历表来加入,以获取全天的值查看本文,谢谢你的帮助。我已经阅读了这篇文章并实现了日历表。我的下一步是在加入日期的mysql查询中同时包含punch_clock和calendar_表吗?@tutchmedia应该是这样的。您可以用日历替换my SQL中的日期。除了它不显示没有数据的日期之外,它还能工作吗?(见我在原始帖子中的提问)有什么想法吗?需要从日历表左键连接到punchcard表吗?我似乎无法正确理解这一点。它仍然没有显示没有条目的日期(参见更新的查询)-有什么想法吗?