【问题标题】:mysql select between two dates / timesmysql 在两个日期/时间之间选择
【发布时间】:2017-01-17 18:13:33
【问题描述】:

我有一个 mysql 数据库,它有一个日期字段和一个时间字段。我需要从数据库中选择以下参数。

从 spiff 中选择,其中日期在 2016 年 2 月 1 日之间,时间等于或大于 12:00:00,日期为 2016 年 2 月 8 日,时间等于或小于 11:59:59

所以在简单的论坛中,我想选择从 7 天前到今天中午到中午的所有内容,其中 12;00:00 是截止时间。

我有这段代码,但它并没有达到我想要的效果

SELECT * 
FROM spiff 
WHERE `date` BETWEEN '" . $week_before . "' AND  '" . $today . "' AND time <= '12:00:00'  
ORDER by id DESC

【问题讨论】:

  • 认真考虑将日期和时间存储为单个实体

标签: php mysql date time


【解决方案1】:

那是行不通的。您不能将日期和时间存储在单独的字段中,然后同时搜索。您排除的所有时间都晚于“中午”,这意味着如果您有这些日期/时间:

02/02/2016 13:00    excluded
02/03/2016 10:00    included
02/04/2016 17:59    excluded

即使日期在您指定的范围内,13:0017:59 也会被排除,因为它们不是 &lt; '12:00:00'

您需要将日期存储为单个日期时间字段,然后您的查询就变得微不足道了:

SELECT ... WHERE datetimefield BETWEEN '2016-02-01 12:00:00' AND '2016-02-08 11:59:59'

请注意,要使这些日期/时间比较起作用,您必须使用 mysql 的实际日期/时间字段和 mysql 的日期时间字符串格式:yyyy-mm-dd。如果您的日期存储为mm/dd/yyyy,那么它们不是日期,它们是字符串,并且适用 mysql 的字符串比较规则,这意味着

'10/11/2015' > '09/01/1970' -> TRUE

因为10 大于09

【讨论】:

    【解决方案2】:

    问题是您将日期和时间部分放在不同的字段中。由于 where 子句中的 AND time &lt;= '12:00:00' 条件,MySQL 将返回所有受影响日期从早上开始的记录。

    最好的解决方案是将这 2 个字段合并为一个具有 datetime 数据类型的字段。这样,where 子句将是:

    ...`datime_field` BETWEEN '" . $week_before_noon . "' AND  '" . $today_noon . "'
    

    这 2 个 php 变量将包含格式为 YYYY-MM-DD hh:mm:ss 的有效日期时间表达式

    另一种解决方案是即时组合来自 2 个字段的值,但这样您就不能使用索引来加快搜索速度:

    ... date + time BETWEEN '" . $week_before . " 12:00:00' AND  '" . $today . " 12:00:00'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多