1

大家好:我正在尝试在我拥有的 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; 

  }  

谢谢!

4

5 回答 5

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";
于 2012-09-20T16:53:11.550 回答
0

您可以尝试以下方式

$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)");
于 2012-09-20T16:51:25.720 回答
0
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
于 2012-09-20T16:52:29.883 回答
0

通过执行以下操作,您可能最好不要使用 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 这是一个相当不错的方法。

于 2012-09-20T16:57:40.520 回答
-1

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

$date = '9-20-2012';
$unixtime = strtotime(str_replace ('-', '/', $date). ' 00:00');
于 2012-09-20T17:12:12.167 回答