CURDATE()12月不工作

时间:2013-12-09 16:09:12

标签: php mysql sql

我使用以下语句从mysql表中选择值:

$a = mysqli_query($con, "SELECT * FROM list WHERE inserted_on<=DATE_SUB(CURDATE(), INTERVAL 0 DAY)");
while($row = mysqli_fetch_array($a))
    { //do something... 
       }

但是查询会跳过12月(第12个月)的结果......

inserted_on行看起来像这样(示例):

2013-12-04 17:50:34 //edited so that it reflects an actual example 
year-month-date hour:minute:second

知道为什么......也许是问题的解决方案?

2 个答案:

答案 0 :(得分:0)

我将尝试根据留下的评论对此进行一次尝试。

我不确定你需要的确切结果,但其中任何一个都应该足够了:

SELECT * FROM list WHERE DATE(inserted_on) <= CURDATE();

OR

SELECT * FROM list WHERE inserted_on <= NOW();

第二个是从运行时角度来看更好的解决方案,特别是如果你的日期被编入索引。

编辑:

注意我在这做什么。

在第一个,因为CURDATE()仅返回2013-01-01,例如你的字段返回一个时间戳然后检查00:00:00和23:59:59之间的所有时间我基本上是说让我只有我的inserted_on字段的DATE,并将其与curdate()进行比较。

在第二个我现在说的()将是2013-12-09 10:54:19这个帖子的日期/时间,我将你的时间戳与2013-01格式表中的时间戳进行比较-01 00:00:00(作为例子)。

答案 1 :(得分:0)

鉴于此示例代码,基于您的示例,它与我一起工作(使用MySQL版本5.0.51b-community-nt,但这不太重要):

DROP TABLE IF EXISTS `test`.`list`;
CREATE TABLE  `test`.`list` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `inserted_on` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO list VALUES( null, '2013-12-04 17:50:34' );
INSERT INTO list VALUES( null, '2013-12-23 17:50:34' );

然后当我执行你的查询时:

SELECT * FROM list WHERE inserted_on <= DATE_SUB(CURDATE(), INTERVAL 0 DAY);

或:

SELECT * FROM list WHERE inserted_on <= CURDATE();

甚至,例如:

SELECT * FROM list WHERE inserted_on <= DATE_SUB(CURDATE(), INTERVAL 1 DAY);

结果是:

| id | inserted_on         |
+----+---------------------+
|  1 | 2013-12-04 17:50:34 |

......正如所料。

因此,您的代码中肯定会发生其他事情,我们并不知道。例如:

  • 你是否肯定该行确实存在?
  • 您对列inserted_on使用的数据类型是什么(即使文本列也可以正常工作)
  • 您使用的是哪个版本的MySQL?

进一步的问题:

  • 在您完成$a电话后立即执行var_dump( $a );时,mysqli_query( ... )的价值是多少?是false吗?
  • 什么是不使用PHP的结果集,而是一些MySQL管理工具直接查询数据库?那么是否给出了预期的结果集?