我的表格格式如下。
Customer_ID Result C_Date
1 2 2017-06-19 15:49:00
1 3 2017-06-20 15:49:00
1 3 2017-06-21 15:49:00
2 1 2017-06-15 15:49:00
3 2 2017-06-15 15:49:00
1 2 2017-06-19 19:49:00
1 3 2017-06-21 23:49:00
我需要获取Customer_ID的所有记录为1和当前周的结果。 例如
Customer_ID Day Total(COUNT)
1 Sunday 0
1 Monday 2
1 Tuesday 1
1 Wednesday 1
1 Thursday 0
1 Friday 0
1 Saturday 0
我在mysql查询中需要这种类型的结果。
答案 0 :(得分:0)
您可以使用WEEKOFYEAR()函数:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-weekofyear-function.php
所以,做一些像WHERE WEEKOFYEAR(C_DATE)= WEEKOFYEAR(NOW())
我怀疑这会非常慢。也许更好的方法是找到当前周的开始和结束日期,然后使用它们来做<和>反对C_Date。
米克
答案 1 :(得分:0)
这样的东西会返回指定的结果:
SELECT c.customer_id AS `Customer_ID`
, d.day AS `Day`
, COUNT(1) AS `Total(COUNT)`
FROM ( SELECT 1 AS customer_id ) c
CROSS
JOIN ( SELECT 1 AS `dow`, 'Sunday' AS `day`
UNION ALL SELECT 2, 'Monday'
UNION ALL SELECT 3, 'Tuesday'
UNION ALL SELECT 4, 'Wednesday'
UNION ALL SELECT 5, 'Thursday'
UNION ALL SELECT 6, 'Friday'
UNION ALL SELECT 7, 'Saturday'
) d
LEFT
JOIN mytable t
ON t.customer_id = c.customer_id
AND t.c_date >= DATE(NOW()) + INTERVAL -7 DAY
AND t.c_date < DATE(NOW())
AND DAYOFWEEK(t.c_date) = d.dow
GROUP BY c.customer_id, d.dow
ORDER BY c.customer_id, d.dow
注:
我们需要一个返回7&#34; Day&#34;价值(周日至周六),否则,我们无法返回&#34;零&#34;当那天没有一行时,从表中计算当天。
我们需要定义&#34;当前周&#34;。上面的查询使用当前日期,并减去七天。如果此查询在星期三运行,我们将获得前七天,周三至周二。如果您对&#34;当前周&#34;的定义与此不同,然后使用在报告期间开始时生成DATETIME值的表达式,以及在报告期间后的第一秒(代替DATE(NOW)) + INTERVAL -7 DAY
和DATE(NOW))
)
<强>后续强>
解决评论:&#34;只获取星期一记录,其他所有记录都不正确&#34;
请理解这一点:StackOverflow 不是一个查询和代码编写服务。 上面的答案说明了一个查询模式的示例,解决了查询需要解决的最大问题之一:
正如上面提到的答案(在说明:)的那条线下,我们需要一个实际的规格,用于&#34;当前周&#34;。这意味着什么时候&#34;今天&#34;是星期二,'2017-06-20'
。指定的日期范围是多少?如果今天是星期五或星期天,这意味着什么呢?
一旦我们有了定义,我们就可以编写表达式,它们将返回开始和结束日期值。
换句话说,......采取这部分问题:
AND t.c_date >= DATE(NOW()) + INTERVAL -7 DAY
AND t.c_date < DATE(NOW())
用以下内容代替:
AND t.c_date >= '2017-06-14'
AND t.c_date < '2017-06-21'
或者像这样:
AND t.c_date >= '2017-06-18'
AND t.c_date < '2017-06-25'
可以使用 literals 的日期,以便查询返回预期的结果?因此查询不是&#34; 只获得星期一记录,所有其他人都不正确&#34; [原文如此]。
我们可以使用简单的SELECT语句来测试表达式。我们可以使用用户定义的变量代替NOW()来测试NOW()的各种可能值。例如:
SET @tday = '2017-06-21 12:34' ;
SELECT DATE(@tday) - INTERVAL DAYOFWEEK(@tday)-1 DAY AS sd
, DATE(@tday) - INTERVAL DAYOFWEEK(@tday)-8 DAY AS ed
一旦我们有表达式返回&#34; start&#34;和&#34;结束&#34;在范围中,我们可以在另一个查询中使用它们。就像上面那个......
AND t.c_date >= DATE(NOW()) - INTERVAL DAYOFWEEK(NOW())-1 DAY
AND t.c_date < DATE(NOW()) - INTERVAL DAYOFWEEK(NOW())-8 DAY