查询STR_TO_DATE()给予000-00-00

时间:2014-11-13 16:29:07

标签: mysql

这是我的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,即该周的注册数量。

1 个答案:

答案 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
....

...但我认为这只是一个例子,说明了获得一周年字符串的日期问题。如果没有,那么第二个解决方案将适合你。