【问题标题】:Retrieve MySQL Events through PHP based on a date variable基于日期变量通过 PHP 检索 MySQL 事件
【发布时间】:2012-09-20 16:41:12
【问题描述】:

大家好:我正在尝试在我拥有的 PHP 文件中从 MySQL 获取数据。用户传入一个日期(当前由“$selectedDate”表示),我希望查询提取与该日期匹配的所有事件。

问题是 MySQL 日期是 unix 格式,这意味着它有小时、秒等。传入的日期只是日期,所以不会完全匹配。

所以我要做的是获取我的日期,添加一个负 1 天的变量和另一个正 1 天的变量,然后根据该范围提取事件。

问题是它不起作用,我不知道为什么!经过大约 2 天的故障排除和搜索,我的 stackoverflow 朋友们,我依靠你们!

有什么想法吗?

  $selectedDate = '9-20-2012';
  $dateComponents = preg_split('~[+*/-]~', $selectedDate);
  $date1 = mktime(0, 0, 0, ( (int)$dateComponents[0] ), (int)$dateComponents[1]-1, (int)$dateComponents[2]);
  $date2 = mktime(0, 0, 0, ( (int)$dateComponents[0] ), (int)$dateComponents[1]+1, (int)$dateComponents[2]);

  $query = "SELECT id,title,start, DATE_FORMAT(start, '%Y-%m-%d %H:%i' ) AS startDate, end, url, className FROM $tableName WHERE start BETWEEN '$date1' AND '$date2' ORDER BY start";

  $result = mysql_query($query) or die(mysql_error());
  $array = array();

  while($row = mysql_fetch_assoc($result)){
        echo($row);
       $array[] = $row; 

  }  

谢谢!

【问题讨论】:

    标签: php mysql variables date-range


    【解决方案1】:

    您可以将分钟和秒添加到日期中,然后再将它们传递给 SQL。

      $selectedDate = '9-20-2012';
      $dateComponents = preg_split('~[+*/-]~', $selectedDate);
      $date1 = mktime(0, 0, 0, ( (int)$dateComponents[0] ), (int)$dateComponents[1]-1, (int)$dateComponents[2]);
      $date2 = mktime(0, 0, 0, ( (int)$dateComponents[0] ), (int)$dateComponents[1]+1, (int)$dateComponents[2]);
    
      $date1 = date('Y-m-d h:i',$date1);
      $date2 = date('Y-m-d h:i',$date2);
    
      $query = "SELECT id,title,start, DATE_FORMAT(start, '%Y-%m-%d %H:%i' ) AS startDate, end, url, className FROM $tableName WHERE start BETWEEN '$date1' AND '$date2' ORDER BY start";
    

    【讨论】:

    • 祝福你,杰里米 1026!!!它WOOOOOOOOOOORRRRRRRRRRKKKKKKKKKKKKKKSSSSSS!!!!!!!!!!!!!!!
    【解决方案2】:

    您最好不要通过执行以下操作来使用 between:

    $selectedDate = '9-20-2012';
    $dateComponents = preg_split('~[+*/-]~', $selectedDate);
    $date = date('Y-m-d', mktime(0, 0, 0, $dateComponents[0], $dateComponents[1], $dateComponents[2]));
    
    $query = "SELECT id, title, start, DATE_FORMAT(start, '%Y-%m-%d %H:%i') AS startDate, end, url, className FROM $tableName WHERE DATE(start) = DATE($date) ORDER BY start";
    

    这样,您将只比较日期部分而忽略时间,如果您不需要实际获得真正的间隔而只需要提供日期的条目,IMO 这是一个相当不错的方法。

    【讨论】:

      【解决方案3】:
      SELECT id, title, start, DATE_FORMAT(start, '%Y-%m-%d %H:%i' ) AS startDate, end, url, className 
      FROM $tableName 
      WHERE FROM_UNIXTIME(start) BETWEEN '2012-09-01' - interval 1 day AND '2012-09-01' + interval 1 day 
      ORDER BY start
      

      【讨论】:

        【解决方案4】:

        你可以试试下面的方法

        $start = strtotime("-1 day", strtotime('09-12-2012'));
        $end = strtotime("+1 day", strtotime('09-12-2012'));
        
        $result = my_sql_query("
                  Select * FROM tablename 
                  WHERE DATE(FROM_UNIXTIME(date_field)) 
                  BETWEEN FROM_UNIXTIME($start) AND FROM_UNIXTIME($end)");
        

        【讨论】:

        • 感谢 GBD,但它不起作用... $start 最终等于 -86391 而 $end 是 86409
        【解决方案5】:

        我认为您可以在 mysql 查询之前将您的日期转换为 unixtime。它可以帮助您获取任何格式的日期。

        $date = '9-20-2012';
        $unixtime = strtotime(str_replace ('-', '/', $date). ' 00:00');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-26
          • 1970-01-01
          相关资源
          最近更新 更多