这是我的MySQL查询:
SELECT YEARWEEK(paid) AS yweek,
STR_TO_DATE(YEARWEEK(paid), '%X%V') AS date,
COUNT(*) AS cnt
FROM members
WHERE YEARWEEK(paid) >= YEARWEEK(curdate()) - 52
GROUP BY yweek
结果如下:
yweek date cnt
201429 0000-00-00 201
201430 0000-00-00 435
201431 0000-00-00 333
201432 0000-00-00 470
201433 0000-00-00 534
yweek
列和cnt
列很好,但日期列始终为0000-00-00
。成员表中的paid
列的格式为(PHP)date("Y-m-d H:i:s")
,列类型为TIMESTAMP
,这里有一个示例:2014-06-26 00:32:02
。
我尝试用YEARWEEK(paid)
替换CAST(YEARWEEK(paid) AS CHAR(7))
,但这没有任何改变。
我使用TIMESTAMP
会导致STR_TO_DATE()
全部为零吗?我希望得到本周的第一个日期以及cnt
,即该周的注册数量。
答案 0 :(得分:2)
问题是:您无法从yearweek
获取日期:有7个选项,您想要哪一个?
mysql> SELECT STR_TO_DATE('201429', '%X%V');
+-------------------------------+
| STR_TO_DATE('201429', '%X%V') |
+-------------------------------+
| 0000-00-00 |
+-------------------------------+
1 row in set (0.00 sec)
如果我们在其中添加“星期几”(%w),它就会神奇地开始着手:
mysql> SELECT STR_TO_DATE('2014290', '%X%V%w');
+----------------------------------+
| STR_TO_DATE('2014290', '%X%V%w') |
+----------------------------------+
| 2014-07-20 |
+----------------------------------+
1 row in set (0.00 sec)
但是:这意味着您必须选择您想要静态的星期几,因为原始日期不再是一周。
当然,在这种情况下,您可能也这样做了:
SELECT
YEARWEEK(paid) AS yweek,
DATE(paid) AS date,
COUNT(*) AS cnt
....
...但我认为这只是一个例子,说明了获得一周年字符串的日期问题。如果没有,那么第二个解决方案将适合你。