Php 日期问题

Php 日期问题,php,mysql,date,Php,Mysql,Date,我的数据库有y m d字段,在月份和日期中没有前导零。我正试着将一份记录y-m-d与今天的日期进行比较。大于或等于显示绿灯图像,否则显示红灯。它不起作用了!救命啊 $q = "SELECT * FROM pec_mbbtmssgs WHERE activity='bike' AND CONCAT(`y`,'-','m','-','d') >= date('Y-n-j')"; $r = mysql_query($q); $row = mysql_fetch_assoc($r); $

我的数据库有y m d字段,在月份和日期中没有前导零。我正试着将一份记录y-m-d与今天的日期进行比较。大于或等于显示绿灯图像,否则显示红灯。它不起作用了!救命啊

    $q = "SELECT * FROM pec_mbbtmssgs WHERE activity='bike' AND CONCAT(`y`,'-','m','-','d')  >= date('Y-n-j')";
$r = mysql_query($q);
$row = mysql_fetch_assoc($r);
$activity = $row['activity'];

if($activity == "bike") {
    $image = "greenlight25";
}
else {
    $image = "redlight25";
}

echo '<img src=http://img/' . $image . '.gif />';
?>
$q=“从pec_mbbtmssg中选择*,其中活动='bike'和CONCAT('y','m','m','d')>=日期('y-n-j')”;
$r=mysql\u查询($q);
$row=mysql\u fetch\u assoc($r);
$activity=$row['activity'];
如果($activity==“bike”){
$image=“greenlight25”;
}
否则{
$image=“redlight25”;
}
回声';
?>
您对
CONCAT()
的使用有点不恰当,因为数据库列要么用反勾号包装,要么什么都不包装,字符串/分隔符用单引号括起来

您也可以通过执行
DATE(NOW())
来获取当前日期,并与之进行比较。然后将
DATE()
CONCAT()的结果一起使用,结果如下

SELECT * 
FROM pec_mbbtmssgs 
WHERE activity='bike' 
  AND DATE(CONCAT(y, '-', m, '-', d)) >= DATE(NOW()) 
更简单的方法是将日期存储在
date
type列中,而不是三个单独的列中。您始终可以提取所需的特定信息(例如,您可以提取月份,即使您的值是
2016-11-30
)。

您对
CONCAT()
的使用有点不恰当,因为数据库列应该用反勾号包装,或者根本不用反勾号,字符串/分隔符应该用单引号括起来

您也可以通过执行
DATE(NOW())
来获取当前日期,并与之进行比较。然后将
DATE()
CONCAT()的结果一起使用,结果如下

SELECT * 
FROM pec_mbbtmssgs 
WHERE activity='bike' 
  AND DATE(CONCAT(y, '-', m, '-', d)) >= DATE(NOW()) 


更简单的方法是将日期存储在
date
type列中,而不是三个单独的列中。你总是可以提取你想要的特定信息(例如,你可以提取月份,即使你的值是
2016-11-30
)。

如果我理解正确:你是否有
y
m
d
?此外,请看这里的引用
CONCAT(`y`、'-'、'm'-'、'-'、'd')
,您正在对
y
使用反勾号,但对
m
d
使用单引号(因此它被解释为字符串)。是的,y、m和dtried的单独列将所有引号更改为反勾号或单引号,这没有帮助。如果我理解正确:您对
y
有单独的列吗,
m
d
?此外,看看这里引用的
CONCAT(`y`、'-'、'm'、'-'、'd')
,你对
y
使用反勾号,但对
m
d
使用单引号(因此它被解释为字符串)。是的,单独的y列,m和dtried将所有引用更改为反勾号或单引号,但没有帮助。尝试了这一次,但没有效果。我想我要做的是用y、m和d字段构建一个字符串,并将其与当前日期进行比较,我认为当前日期也被格式化为字符串。因此,将一个字符串与另一个字符串进行比较。我不确定是否理解您的评论,但您是否使用了CURDATE()?请执行以下SQL语句。这可能会让你有所了解。这种比较应该有效。选择unix_时间戳(CONCAT(2016,'-',11,'-',30)),unix_时间戳(CURDATE())在发送时插入,但仍不工作。数据库中的y、m、d字段只是数字,而不是unixtimstamp中的数字。我试图用yyy-m-d格式将它们与日期('Y-n-j')进行比较,日期('Y-n-j')的格式相同,n和j数字上没有前导零。尝试比较两个苹果,但不起作用。我分别运行两个日期(“Y-n-j”)和CONCAT(Y',-',m',-',d),它们都以YYYY,n-j格式返回日期。我只是无法让它们在查询中相互比较并生成所需的结果。尝试了这个,但没有效果。我想我要做的是用y、m和d字段构建一个字符串,并将其与当前日期进行比较,我认为当前日期也被格式化为字符串。因此,将一个字符串与另一个字符串进行比较。我不确定是否理解您的评论,但您是否使用了CURDATE()?请执行以下SQL语句。这可能会让你有所了解。这种比较应该有效。选择unix_时间戳(CONCAT(2016,'-',11,'-',30)),unix_时间戳(CURDATE())在发送时插入,但仍不工作。数据库中的y、m、d字段只是数字,而不是unixtimstamp中的数字。我试图用yyy-m-d格式将它们与日期('Y-n-j')进行比较,日期('Y-n-j')的格式相同,n和j数字上没有前导零。尝试比较两个苹果,但不起作用。我分别运行两个日期(“Y-n-j”)和CONCAT(Y',-',m',-',d),它们都以YYYY,n-j格式返回日期。我只是无法让他们在查询中相互比较,并产生所需的结果。哎呀!真管用!我唯一的问题是,在我的数据库和DATENow函数中,今天的日期都有两个数字表示月份和日期。当月份变为1月份时,它仍然有效吗?或者Date(NOW()返回一个带前导零的值,表示一位数的月份或天数?这应该有效。您可以通过运行类似于
SELECT Date('2016-01-01')=Date('2016-1-1')
)的命令来验证这一点,该命令应该返回true(MySQL中的
1
)-因此,只要格式正确,是否有前导零无关紧要。很高兴能提供帮助!如果这个答案解决了您的问题,请:-)就像我说的,处理1
DATE
列(
yyy-mm-dd
)可能比处理3个单独的整数列更容易。如果您只需要月份,您可以选择日期格式('2016-11-30','%M')作为月份
,这将为您提供
11
。您可以将
2016-11-30
替换为
DATE
类型列的名称。谢谢。我同意“1日期”列更有意义,但我使用的日历软件将y d m插入数据库中的3个不同字段。远远超出我目前的能力