Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 在两个格式错误的日期字段之间搜索_Php_Mysql_Datetime - Fatal编程技术网

Php 在两个格式错误的日期字段之间搜索

Php 在两个格式错误的日期字段之间搜索,php,mysql,datetime,Php,Mysql,Datetime,我有一个表,其中日期列(sessionend)的值如下所示: Sep 10, 2013 2:33 AM SELECT * FROM `tictoc` WHERE STR_TO_DATE(`sessionend`, '%b %e, %Y %l:%i %p') BETWEEN '$convertedStart' AND '$convertedEnd' 以下是我的用户输入日期: $convertedStart = '2013-08-01 00:00:01'; $convertedEnd = '

我有一个表,其中日期列(sessionend)的值如下所示:

Sep 10, 2013 2:33 AM
SELECT * 
FROM `tictoc` 
WHERE STR_TO_DATE(`sessionend`, '%b %e, %Y %l:%i %p') BETWEEN '$convertedStart' AND '$convertedEnd'
以下是我的用户输入日期:

$convertedStart = '2013-08-01 00:00:01';
$convertedEnd = '2013-10-15 23:59:59';
这是我的问题

"SELECT * FROM `tictoc` WHERE sessionend BETWEEN '".$convertedStart."' AND '".$convertedEnd."'"
如何转换来自数据库的时间,以便使用以下格式进行搜索:

yyy-mm-dd 00:00:00
谢谢使用strotime()和date():

使用strotime()和date():


您可以使用strotime()来计算彼此之间的时间:这将转换为unix时间戳


但是,如果您想将其转换为日期,请使用日期('Y-m-dh:i:s',$variable)

您可以使用strotime()将时间彼此分开:这将转换为unix时间戳


但如果您想将其转换为日期,请使用日期('Y-m-dh:i:s',$variable)

最好的解决方案是将日期时间格式转换为本机格式。

将新字段
new_字段
作为
DATETIME
类型添加到表中。然后运行查询:

UPDATE `tictoc`
SET `new_field` = STR_TO_DATE(`sessionend`, '%b %e, %Y %l:%i %p');
然后删除旧字段
sessionend
,并将字段
new\u字段
重命名为
sessionend


您仍然可以这样运行查询:

Sep 10, 2013 2:33 AM
SELECT * 
FROM `tictoc` 
WHERE STR_TO_DATE(`sessionend`, '%b %e, %Y %l:%i %p') BETWEEN '$convertedStart' AND '$convertedEnd'

但这将忽略字段
sessionend
上的任何索引,并循环表中的所有记录。

最佳解决方案是将日期时间格式转换为本机格式。

将新字段
new_字段
作为
DATETIME
类型添加到表中。然后运行查询:

UPDATE `tictoc`
SET `new_field` = STR_TO_DATE(`sessionend`, '%b %e, %Y %l:%i %p');
然后删除旧字段
sessionend
,并将字段
new\u字段
重命名为
sessionend


您仍然可以这样运行查询:

Sep 10, 2013 2:33 AM
SELECT * 
FROM `tictoc` 
WHERE STR_TO_DATE(`sessionend`, '%b %e, %Y %l:%i %p') BETWEEN '$convertedStart' AND '$convertedEnd'


但这将忽略字段
sessionend
上的任何索引,并循环表中的所有记录。

我这样做了,但当我将用户输入转换为这种格式“2013年9月10日2:33 AM”时,它似乎无法正确运行查询。我得到了所有的结果。所以我猜不可能在这两种格式之间选择值:2013年9月10日2:33有趣的是,上面我得到的输出是2013-09-10 02:33:00(与您得到的其他日期一致)。在查询中,尝试sessionend>=date1,sessionend将不起作用。使用此方法将导致OP比较数据库中的字符串,并且
Dec 12
小于
Sep 12
,因为
D
在字母表中位于
S
之前,但这不起作用。我想我可能只是在查询后转换日期,添加一个IF语句,以便仅显示两个日期之间的行。我确实转换了,但当我将用户输入转换为“2013年9月10日2:33 AM”格式时,似乎无法正确运行查询。我得到了所有的结果。所以我猜不可能在这两种格式之间选择值:2013年9月10日2:33有趣的是,上面我得到的输出是2013-09-10 02:33:00(与您得到的其他日期一致)。在查询中,尝试sessionend>=date1,sessionend将不起作用。使用此方法将导致OP比较数据库中的字符串,并且
Dec 12
小于
Sep 12
,因为
D
在字母表中位于
S
之前,但这不起作用。我想我可以在查询后转换日期,添加一个IF语句,仅在两个日期之间显示行。真正的解决方案是修复表,以便存储本机日期/时间值,而不是随机文本字符串。然后你的问题消失了,事情就开始了。这是正确的解决方案。但输出日期为2013年9月10日凌晨2:33,并通过CSV导入的程序。我目前有1000个日期已经以该格式存储。请在读取csv文件时修复这些日期。最好将日期转换为本机日期一次,而不是每次运行查询时都要动态转换。我必须同意Marc的观点。更新数据库中已经存储的当前日期也会很快。的确,我只需要通过一个简单的步骤,在php中进行更改,以从csv文件转换。然后进入并将当前的转换为本机。感谢各位,真正的解决方案是修复表,以便存储本机日期/时间值,而不是随机文本字符串。然后你的问题消失了,事情就开始了。这是正确的解决方案。但输出日期为2013年9月10日凌晨2:33,并通过CSV导入的程序。我目前有1000个日期已经以该格式存储。请在读取csv文件时修复这些日期。最好将日期转换为本机日期一次,而不是每次运行查询时都要动态转换。我必须同意Marc的观点。更新数据库中已经存储的当前日期也会很快。的确,我只需要通过一个简单的步骤,在php中进行更改,以从csv文件转换。然后进入并将当前的转换为本机。谢谢各位