Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用mysql日期查询得到错误答案_Php_Mysql_Sql_Time_Datetime Format - Fatal编程技术网

Php 使用mysql日期查询得到错误答案

Php 使用mysql日期查询得到错误答案,php,mysql,sql,time,datetime-format,Php,Mysql,Sql,Time,Datetime Format,这是我的桌子 我正在执行一个查询,该查询为我提供字段的结果,这些字段的item\u valid\u from必须大于今天的date并且item\u valid\u to必须小于今天 我的问题是 select * from tbl1 where item_valid_from >= CurDate() and item_valid_to < CurDate() 选择* 来自tbl1 其中项目\u valid\u from>=CurDate() 和项目有效到

这是我的桌子

我正在执行一个查询,该查询为我提供字段的结果,这些字段的
item\u valid\u from
必须大于今天的
date
并且
item\u valid\u to
必须小于今天

我的问题是

select * 
  from tbl1 
 where item_valid_from >= CurDate() 
       and item_valid_to < CurDate()
选择*
来自tbl1
其中项目\u valid\u from>=CurDate()
和项目有效到

有解决办法吗

假设数据类型
item\u valid\u from
item\u valid\u to
是日期、时间戳等,那么您的运算符是向后的。自1970年以来,将时间视为秒,因为这是它在unix时间中的存储方式。这意味着
item\u valid\u from
将小于
item\u valid\u to
,并且您希望它在今天介于两者之间时显示。您希望来自
item\u valid\u小于或等于现在,并且
item\u valid\u to
大于现在(不是过去)

选择*
来自tbl1
其中项目从CURDATE()开始生效

参见此示例,只有2-4是有效的,并显示在结果中,从过去的某个日期开始生效,到将来的某个日期到期。

您必须使用以下查询更改当前日期格式,然后比较日期和获取结果:

SELECT *
FROM tbl1
WHERE date_format(item_valid_from,'%d-%m-%Y') >= date_format(CurDate( ),'%d-%m-%Y')
AND date_format(item_valid_to,'%d-%m-%Y') < date_format(CurDate( ),'%d-%m-%Y')
选择*
来自tbl1
其中日期格式(项目有效日期从,'%d-%m-%Y')>=日期格式(CurDate(),'%d-%m-%Y'))
和日期格式(项目有效至,'%d-%m-%Y')<日期格式(CurDate(),'%d-%m-%Y'))

请检查此项:

我建议您将
项目\u有效*
字段格式更改为
日期
字段格式。将来你会省去很多麻烦

但好的,如果您不想这样做,那么您可以使用函数:

选择*
从`表`
其中CURDATE()介于STR_TO_DATE(`from_field`、'%d-%m-%Y')和STR_TO_DATE(`TO_field`、'%d-%m-%Y')之间

如果您将日期存储为YYYY-MM-DD在
date
字段中,您不会有任何问题……您的意思是我必须修改我的表结构,对吗?@sourabhkasliwal:如果您可以这样做,请这样做……@sourabhkasliwal将时间视为自1970年以来的秒,因为它是在unix时间中存储的方式。这意味着“item\u valid\u from”将小于“item\u valid\u to”,并且您希望在今天介于两者之间时显示它。@doublesharp我刚刚编写的查询在任何情况下都不起作用。
CURDATE
正在返回
YYYY-MM-DD
格式。那么,如何将
DD-MM-YYYY
CURDATE()
进行比较呢?它们是日期,而不是字符串,所以即使它们的格式是这样,您仍然可以将它们作为日期进行比较。使用当前时间戳可能更合适,请查看我的Sql Fiddle示例。@sourabhkasliwal在我答案的底部。在表架构中,item_valid_from和item_valid_to的数据类型是什么?他们需要一个日期来进行比较。在我的情况下是这样的varchar@sourabhkasliwal我强烈建议在进行比较之前更改数据类型或强制转换它。我已经更新了我的答案。您只需将日期更改为当前日期它不工作您的解决方案是错误的它只检查d它不工作的月份和年份字段,如果我将日期设置为2014年4月29日它工作,但对于2014年4月4日它不工作它不工作,它只工作的当月,我的意思是它只匹配d,不考虑月和月year@Sourabh我已经在本地系统中进行了测试。我已经更新了我的答案,请看。接受它。如果我将字段从varchar更改为Date,则正常查询将有效是,然后使用
CURDATE()
进行简单比较将有效。但在更改字段格式之前,您需要将当前数据更改为
YYYY-MM-DD
格式。
SELECT *
FROM tbl1
WHERE date_format(item_valid_from,'%d-%m-%Y') >= date_format(CurDate( ),'%d-%m-%Y')
AND date_format(item_valid_to,'%d-%m-%Y') < date_format(CurDate( ),'%d-%m-%Y')