我正在尝试显示特定用户当月的记录数。不幸的是,它不起作用,因为一次没有正确指出数据库中的日期格式。 在文本列中,日期以纯文本格式编写。 怎样成为?我尝试了很多,没有任何结果。
我尝试STR_TO_DATE,转换和其他-输出为null或mysql错误。 我还尝试将请求手动输入phpmyadmin。不成功。
Mysql版本:5.6.39-83.1(Linux)
$modercount = mysqli_query($link, 'SELECT moder, COUNT(*) FROM my_logs WHERE server="'.$profileid.'" AND MONTH(time) = MONTH(NOW()) AND YEAR(time) = YEAR(NOW()) GROUP BY moder ORDER BY COUNT(*) DESC') or die(mysqli_error($link));
我的sql列中的日期格式:10.04.2018 12:52:18
答案 0 :(得分:1)
首先,将文本格式的日期正确转换为DATETIME。 STR_TO_DATE()uses the same format strings as its reverse, DATE_FORMAT()。
SELECT STR_TO_DATE(`time`, '%Y.%m.%d %H:%i:%s')
第二,使用LAST_DAY()处理月份算术,选择所需的日期戳范围。
WHERE STR_TO_DATE(`time`, '%Y.%m.%d %H:%i:%s')
>= LAST_DAY(CURDATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND STR_TO_DATE(`time`, '%Y.%m.%d %H:%i:%s')
< LAST_DAY(CURDATE) + INTERVAL 1 DAY
如果有机会,请在表中添加带有DATETIME或TIMESTAMP格式的日期戳的新列。这样,您的日期范围选择就可以利用索引。如何做到这一点超出了您今天的问题范围。
答案 1 :(得分:0)
您应该以这种方式使用str_to_date
select str_to_date('10.04.2018 12:52:18', '%d.%m.%Y %T')
答案 2 :(得分:0)
这对我有用。
$modercount = mysqli_query($link, 'SELECT moder, COUNT(*) FROM mylogs WHERE server="'.$profileid.'" AND MONTH(str_to_date(`time`, "%d.%m.%Y %T")) = MONTH(NOW()) AND YEAR(str_to_date(`time`, "%d.%m.%Y %T")) = YEAR(NOW()) GROUP BY moder ORDER BY COUNT(*) DESC') or die(mysqli_error($link));
非常感谢@scaisedge和@ o-jones