2013-10-15 128 views
0

我有一个表,其中日期栏(SESSIONEND)值是这样的:搜索之间两个日期字段

Sep 10, 2013 2:33 AM 

这里是我的用户输入日期:

$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 

感谢

+5

真正的解决方案是修复您的表格,以便存储原生日期/时间值而不是随机的文本字符串。那么你的问题就会消失,事情就会开始起作用。 –

+0

这是正确的解决方案。但输出日期为2013年9月10日上午2:33的程序,并且通过CSV导入。我目前有1000个日期已经以这种格式存储。 – Hector

+2

修复您从csv文件读取日期。最好将日期转换为本地ONCE,而不是每次运行查询时都要将它们即时转换。 –

回答

4

最好的解决办法是将你的日期时间格式转换为本地格式。

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

UPDATE `tictoc` 
SET `new_field` = STR_TO_DATE(`sessionend`, '%b %e, %Y %l:%i %p'); 

然后删除旧场sessionend,并重新命名场new_fieldsessionend


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

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

但这会忽略场sessionend,以及循环任何指标在上表中的所有记录。

0

使用的strtotime()和日期():

$originalDate = "Sep 10, 2013 2:33 AM"; 
$newDate = date("Y-m-d H:i:s", strtotime($originalDate)); 
+0

我做过,但是当我把用户输入转换成这种格式'2013年9月10日上午2:33'它似乎没有正确运行查询。我得到所有返回的结果。所以即时猜测这是不可能选择这种格式之间的值:2013年9月10日上午02:33 – Hector

+0

使用上述我得到2013-09-10 02:33:00的输出(这是符合其他日期你越来越多)。在你的查询中试试sessionend> = date1 AND sessionend <= date2? –

+0

不工作。使用这种方法将导致OP比较数据库中的字符串,'12月12日'比'9月12日'少,因为'D'出现在字母表中的'S'之前 –

0

你可以相互使用的strtotime()取次远:这个转换为unix时间戳

但是如果你想使它成为一个日期使用日期('YMD H:我:S',$变量)

相关问题