【发布时间】:2019-07-16 23:42:06
【问题描述】:
我不断看到这样的答案:https://stackoverflow.com/a/21277074/4236404 是默认接受的答案,用于在 MySQL 查询中获取本月至今的行。
当前答案:
SELECT id, created
FROM table1
WHERE MONTH(created) = MONTH(CURDATE())
AND YEAR(created) = YEAR(CURDATE())
这个查询可以工作,但效率低下,MySQL 将执行完整扫描以获取结果。
因此,获取本月至今(MTD)查询的行的正确方法如下(我将使用 PDO 和 PHP 来演示:
//get the first day of the month
$month_first_day = date( "Y-m-01" );
//select the record where the created date is equal to or bigger than the first day of the current month.
$stmt = $pdo->prepare('SELECT id, created FROM table1 WHERE created >= :first_day_of_month');
$stmt->bindParam(':first_day_of_month', $month_first_day);
$stmt->execute();
$realm_data = $stmt->fetch();
奖励查询:
要获取今天的所有记录,请执行以下操作:
$today = date( "Y-m-d" );
$stmt = $pdo->prepare('SELECT id, created FROM table1 WHERE created >= :today');
$stmt->bindParam(':today', $today);
$stmt->execute();
$realm_data = $stmt->fetch();
要获取昨天的所有记录,请执行以下操作:
$today = date( "Y-m-d" );
$yesterday = date( "Y-m-d", time()-86400 );
$stmt = $pdo->prepare('SELECT id, created FROM table1 WHERE created >= :yesterday AND created < :today');
$stmt->bindParam(':today', $today);
$stmt->bindParam(':yesterday', $yesterday);
$stmt->execute();
$realm_data = $stmt->fetch();
要获取过去 7 天的所有记录,请执行以下操作:
$seven_days_ago = date('Y-m-d', strtotime('-7 days'));
$stmt = $pdo->prepare('SELECT id, created FROM table1 WHERE created >= :seven_days_ago');
$stmt->bindParam(':seven_days_ago', $seven_days_ago);
$stmt->execute();
$realm_data = $stmt->fetch();
假设/提示:
MySQL中的列设置为日期时间格式。
【问题讨论】:
-
基于日期或日期时间范围过滤行的规范模式是表具有数据类型 DATE、DATETIME 或 TIMESTAMP 的列;然后将其与范围的开始和范围值的结束进行比较。例如
WHERE t.mydtcol >= '2019-02-01' AND t.mydtcol < '2019-02-01' + INTERVAL 1 MONTH.我们可以使用表达式代替文字,例如WHERE t.mydtcol >= DATE_FORMAT(NOW(),'%Y-%m-01') + INTERVAL 0 MONTH AND t.mydtcol < DATE_FORMAT(NOW(),'%Y-%m-01') + INTERVAL 1 MONTH -
很确定这个
LIKE CONCAT(DATE_FORMAT(<datetime>), '%Y-%m'), "%")至少它会在 DATETIME 并且可以使用索引...我看到了你的回答基本上你想避免在 anny 运算符的左侧使用函数或像IN这样的关键字或LIKE -
Sjoe,一个试图帮助别人的教程被投了很多票,人们在下面看不到我的回答和解释吗?
-
好吧,如果你想为新程序员编写一个编写高效查询的教程,你难道不应该自己知道如何去做吗??
-
我不明白,我在下面写了帖子,然后stackoverflow说我也需要回答。让我删除当前的 OP 并在那里发布我的答案