【问题标题】:Select results that are only between today and 2 days in the future选择仅在今天和未来 2 天之间的结果
【发布时间】:2015-02-18 18:36:37
【问题描述】:

我对使用日期感到很困惑。如何编写此查询,使其仅选择今天和未来 2 天之间的结果?

日期存储在名为 EstimatedTime 的列中(具有“文本”类型...),例如 201502181150

<?php 

$stmt = $db->query('SELECT * FROM data WHERE Status = "D" ORDER BY id DESC');

/*
$Date = 201502181150;
$time_ahead = date('M d', strtotime($Date. ' + 2 days'));
// The above returns Feb 20, but how can I do this on MySQL?
*/

while($row = $stmt->fetch()) {
    echo "<tr>";
    echo '<td>' . date('M d', strtotime($row['EstimatedTime'])) . '</td>';
    echo "</tr>";
}

?>

任何帮助将不胜感激!非常感谢。

【问题讨论】:

  • EstimatedTime 列的类型是什么?
  • EstimatedTime 列具有“文本”类型。不知道为什么,但我只是在使用它。
  • 如果您无法将列类型修改为 timestamp 或类似类型(推荐),您应该查阅 mysql 的文档,了解将文本转换为时间戳并将其用于 where 子句。

标签: php mysql


【解决方案1】:

如果EstimatedTime 列被声明为数据类型DATETIMEDATE,那么很简单:

WHERE t.EstimatedTime >= DATE(NOW())
  AND t.EstimatedTime  < DATE(NOW()) + INTERVAL 2 DAY

NOW() 返回当前日期和时间,DATE() 函数修剪掉时间部分,使其等于午夜。


如果该列被声明为字符类型,而不是DATETIME(但为什么在上帝的绿地上你会这样做呢?),将DATETIME 表达式转换为适当规范格式的字符,以便字符串比较将适当地工作:

WHERE t.EstimatedTime >= DATE_FORMAT(DATE(NOW())                 ,'%Y%m%d%H%i%s')
  AND t.EstimatedTime  < DATE_FORMAT(DATE(NOW()) + INTERVAL 2 DAY,'%Y%m%d%H%i%s')

如果EstimatedTime 存储为数字(整数)数据类型,则通过添加零将字符串转换为数字...

WHERE t.EstimatedTime >= DATE_FORMAT(DATE(NOW())                 ,'%Y%m%d%H%i%s')+0
  AND t.EstimatedTime  < DATE_FORMAT(DATE(NOW()) + INTERVAL 2 DAY,'%Y%m%d%H%i%s')+0

【讨论】:

    【解决方案2】:

    您可以使用str_to_date函数并添加间隔:

    select str_to_date('201502181150', '%Y %m %d');
    

    所以您的查询将是:

    WHERE str_to_date(t.EstimatedTime, '%Y %m %d') >= date(now()) 
      AND str_to_date(t.EstimatedTime, '%Y %m %d') < date(now()) + interval 2 day
    

    【讨论】:

    • 这种方法可行,但是将EstimatedTime 列包装在一个函数中会禁止MySQL 使用有效的范围扫描操作(使用以EstimatedTime 作为前导列的索引...该函数具有对表中的每一行进行评估。为了性能,我们更喜欢在字面上执行转换,因为评估只需执行一次。
    • 感谢您的解释。很高兴知道:)
    【解决方案3】:

    PHP 解决方案: 201502181150 的值是以毫秒为单位的日期吗?如果是这样,只需将其视为整数并添加 1000*60*60*24*2 即 2 天。你可以这样做:

    $t = (int)$row['EstimatedTime'];
    $query = "SELECT * FROM data WHERE EstimatedTime > $t AND EstimatedTime < ". ($t+1000*60*60*24*2) ." ORDER BY id DESC"
    

    但这是一种方式,因为您必须执行 2 个 MySQL 查询。

    【讨论】:

      【解决方案4】:

      我会尝试类似的东西

      <?php
      
      $stmt = $db->query('SELECT * FROM data WHERE Status = "D" ORDER BY id DESC');
      
      $currDate = time();
      
      //$time_ahead = Current Date + 2 Days (172800 seconds = 2 days)
      $time_ahead = $currDate + 172800;
      
      while($row = $stmt->fetch()) {
          if (!strtotime($row['EstimatedTime'] < $currDate || !strtotime($row['EstimatedDate'] > $time_ahead))) {
              echo "<tr>";
              echo '<td>' . date('M d', strtotime($row['EstimatedTime'])) . '</td>';
              echo "</tr>";
          }
      }
      
      ?>
      

      【讨论】:

        猜你喜欢
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        • 2013-09-16
        相关资源
        最近更新 更多