SQL: 查找包含特定日期的数据

SQL: finding data that contains a certain date

我正在尝试 return 2014 年 8 月出版的书籍的标题。我不确定哪里出了问题。

SELECT title_name
FROM titles
WHERE pubdate = '2014-08%';

我知道如何查找两个不同日期之间的书名,那么除了大于号或小于号被等号替换之外,格式不应该相同吗?

SELECT title_name
FROM titles
WHERE pubdate > '2014-07-15'
AND pubdate < '2014-08-15';

如果您要使用通配符,则需要使用 LIKE 而不是 =:

SELECT title_name
FROM titles
WHERE pubdate LIKE '2014-08%';

但更好的方法可能是仅指定月份和年份(使用 MONTH() and YEAR()):

SELECT title_name
FROM titles
WHERE MONTH(pubdate) = 8 AND YEAR(pubdate) = 2014;

其实,你一开始的想法是对的。您将 "August 2014" 视为一个约会对象而错过了它。它根本不是一个日期,它是一个间隔。间隔可以由两个日期分隔,开始日期和结束日期。或者,如果是一个月的间隔,这不是一个固定的持续时间——有的是 30 天,有的是 31 天,有的甚至更少——则使用下个月的开始作为结束日期。

因此正确的查询看起来与您的示例非常相似:

SELECT  title_name
FROM    titles
WHERE   pubdate >= '2014-07-01'
    AND pubdate < '2014-08-01';

而且它具有可搜索的额外好处。也就是说,如果 pubdate 被索引,索引将被使用。搜索将从 8 月印刷的第一本书开始,并在到达 8 月之后印刷的第一本书时停止。如果将 pubdate 传递给函数,则无法使用索引,并且必须扫描整个 table 中的每个 pubdate。