【问题标题】:Query for rows within a date range that also have a specified substring查询日期范围内也具有指定子字符串的行
【发布时间】:2015-05-06 15:50:08
【问题描述】:

我正在尝试查询 MySQL 数据库并返回给定日期范围内的所有记录,其中还包含内容列中的子字符串“银行”。

我指的“时间”字段的格式是mm/dd/yyyy hh:mm:ss

这是我想出的声明,但 MySQL Workbench 给了我一些问题:

SELECT * 
FROM blogs 
WHERE ((‘time’ BETWEEN “04/01/2011 00:00:00” AND “04/15/2011 23:59:59”) 
   AND (‘content’ LIKE ‘%bank%’))

【问题讨论】:

  • 如果你做一个没有时间限制的选择,你会得到什么原始数据?查看日期和时间类型的 MySQL 文档,没有 mm/dd/yyyy hh:mm:ss 的格式(来自dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html)。
  • 日期和时间遵循 sql 中的特定格式。这不是它。并且不要使用 Word 来格式化查询!
  • 按照上面的cmets,我们可以假设time列是VARCHAR()类型吗?
  • OP,你还在努力解决这个问题吗?
  • @McAdam331 我能够让它工作,这是双引号的问题。感谢大家的帮助!

标签: mysql sql date wildcard


【解决方案1】:

试试这个怎么样:

SELECT * 
    FROM blogs 
    WHERE `time` BETWEEN '2011-04-01 00:00:00' AND '2011-04-15 23:59:59' 
        AND `content` LIKE '%bank%';

如果您的 time 字段实际上是时间戳,则此方法有效。如果time 不是时间戳,那么您将不得不使用类似于 McAdam331 的答案,但我希望您的数据库对您要求的数据类型使用正确的类型商店。

' 或双 " 引号围绕值并在字段名称周围打勾`。我还将日期格式更改为 yyyy-mm-dd hh:mm:ss 和去掉了一些不必要的括号。

http://sqlfiddle.com/#!9/730bd/1/0

如果您在发布此类问题时发布表格的结构将会很有帮助,这样我们就可以确保给出正确的答案。

【讨论】:

  • 感谢您的支持;P 我喜欢这个答案,老实说,这取决于 OP 是使用时间戳还是字符串。如果他们使用时间戳,我怀疑是使用双引号引起了问题,或者他们使用了错误的字符串格式进行比较,这两者你都很好地介绍了。
【解决方案2】:

在 MySQL 中存储日期不是一个好主意。 DBMS 有Date and Time Types 可用于存储该信息。

如果无法更改数据库,您可以使用 STR_TO_DATE 函数将字符串转换为日期对象,该函数接受日期字符串及其已采用的格式并返回日期。

MySQL 以 'YYYY-MM-DD' 格式存储日期,因此要获得该格式,您可以尝试以下操作:

SELECT STR_TO_DATE('04/01/2011', '%m/%d/%Y');

这将返回当天的日期对象。 注意大写 Y。

那么在日期之间查询就变得容易多了,像这样:

SELECT *
FROM myTable
WHERE STR_TO_DATE(dateString, '%m/%d/%Y %H:%i:%s') BETWEEN STR_TO_DATE('04/01/2011 00:00:00', '%m/%d/%Y %H:%i:%s') AND STR_TO_DATE('04/15/2011 23:59:59', '%m/%d/%Y %H:%i:%s')
      AND content LIKE '%bank%';

这是一个SQL Fiddle 示例,这是一个link,其中包含您需要的格式字符。

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多