【问题标题】:Mysql get records WHERE MONTHNAME() & YEAR() equals to a valueMysql 获取记录 WHERE MONTHNAME() & YEAR() 等于一个值
【发布时间】:2017-04-20 20:15:35
【问题描述】:

我正在尝试从下表中获取所有“项目”ID,条件为 uid='1' 和 Month='August' 和 Year='2016'

date               |     uid    |     project
-------------------------------------------
Wed, 01 Aug 2016   |     1      |      11
Tue, 15 Aug 2016   |     2      |      11
Mon, 31 Aug 2016   |     1      |      11
Thu, 05 Sep 2016   |     1      |      12
Sat, 10 Sep 2016   |     2      |      12
Mon, 12 Feb 2017   |     3      |      12
Tue, 31 Feb 2017   |     1      |      13
Wed, 31 Mar 2017   |     2      |      13
Fri, 31 Mar 2017   |     3      |      13
Thu, 31 Mar 2017   |     1      |      14

下面是我使用的查询

SELECT project FROM logs where uid="1" AND MONTHNAME(STR_TO_DATE(date,'%W, %d %M %Y'))="August" AND YEAR(STR_TO_DATE(date,'%W, %d %M %Y'))="2016";

但它也会返回其他月份的记录。我在这里做错了什么?

【问题讨论】:

  • AND date like '%Aug%' AND date like '%2016%' 保持简单。
  • 如果你对这个项目不太了解,你应该考虑使用mysql的内置日期函数。你现在做的工作量很大

标签: php mysql


【解决方案1】:

我只会使用like:

SELECT project
FROM logs 
WHERE uid = 1 AND 
      date LIKE '% Aug 2016';

不要将日期/时间值存储为字符串。如果你这样做,不要称它们为“日期”,称它们为“datestr”之类的名称以防止出现意外错误。但是如果它是一个字符串,你可以把它当作一个字符串来对待。

【讨论】:

  • 感谢您的回答。此查询还返回 2017 年 8 月的记录。
  • @Thowzif 。 . .它会怎么做? like 模式明确地有 2016 年。您是否有具有不同日期格式的记录?
  • 感谢您的询问。我已经想通了。产生该结果的是单个 \" 字符。
【解决方案2】:
SELECT project 
FROM logs 
WHERE uid= 1
AND MONTHNAME(STR_TO_DATE(date,'%W, %d %M %Y'))= 'August' 
AND YEAR(STR_TO_DATE(date,'%W, %d %M %Y'))= 2016
;

【讨论】:

  • 我看不到您的查询与我的查询之间的差异。你能解释一下吗?
  • @Thowzif 你提到 uid 和年份部分作为字符串使用整数。
  • 感谢您的跟进。我使用了 Gordon Linoff 建议的查询。感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多