【问题标题】:Trying to add date range to query尝试添加日期范围进行查询
【发布时间】:2018-01-31 23:27:16
【问题描述】:

我正在使用 OpenCart 并正在尝试更改此查询。我需要更改它,以便它返回去年(从现在起 1 年)的记录这是我的查询

$query = $this->db->query("SELECT count(*) AS total, channel FROM `" . DB_PREFIX . "order` WHERE customer_id = '" . (int)$customer_id . "' && order_status_id IN(" . implode(",", $implode) . ") AND YEAR(date_added) = YEAR(CURDATE()) GROUP BY channel");

我尝试将其更改为这个,但它没有工作:

$query = $this->db->query("SELECT count(*) AS total, channel FROM `" . DB_PREFIX . "order` WHERE customer_id = '" . (int)$customer_id . "' && order_status_id IN(" . implode(",", $implode) . ") AND date_added BETWEEN CURDATE() - INTERVAL 1 year AND CURDATE()) GROUP BY channel");

【问题讨论】:

  • “没用。”请对此更加清楚。你得到了什么错误?
  • 没有错误,只是没有改变结果
  • 如果添加额外过滤器后结果没有变化,则所有记录都满足额外条件。
  • @Strawberry sql 代码中 db 前缀和表名之间没有点。
  • 顺便说一句,虽然冗长,但像 date_added BETWEEN CONCAT(YEAR(CURDATE()),'-01-01') AND CONCAT(YEAR(CURDATE()),'-12-31') 这样的东西可以使用索引,因此有可能提高效率。

标签: php mysql opencart


【解决方案1】:

在此之前,请考虑清理您的输入数据,以保护您的查询免受 SQL 注入。 Here你可以找到一些关于这个话题的内容。

基于this answer,我们可以将您的PHP代码调整为以下内容:

$query = $this->db->query("SELECT count(*) AS total, channel 
               FROM `" . DB_PREFIX . "order` 
               WHERE customer_id = '" . (int)$customer_id . "' 
                 AND order_status_id IN(" . implode(",", $implode) . ")
                 AND date_added >= DATE_SUB(NOW(),INTERVAL 1 YEAR)
               GROUP BY channel");

【讨论】:

  • Mysql 确实理解 && 操作符。
  • 真的吗?我不知道!感谢您的信息,我正在编辑答案!
  • 加上使用 now() 而不是 curdate() 可能会产生讨厌的副作用,具体取决于要求。此外,如果您认为当前问题已在 SO 上得到解答,则不应回答,而应将该问题标记为重复。好的,由于您的代表,您可能还不能这样做。
  • 是的,我不能将其标记为重复,这就是为什么我将原始答案链接到答案。感谢您的评论,我试图帮助解决一个问题,我学到的不仅仅是 OP 呵呵
【解决方案2】:

在计算去年时,您的语法有误。

您可以使用DATE_SUB

$query = $this->db->query("SELECT count(*) AS total, channel FROM `" . DB_PREFIX . "order` WHERE customer_id = '" . (int)$customer_id . "' && order_status_id IN(" . implode(",", $implode) . ") AND date_added BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AND CURDATE()) GROUP BY channel");

【讨论】:

  • 不,问题中的语法是正确的。它是 date_sub() 的替代语法,请参阅 date_add() 上的 mysql 文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多