2013-08-28 22 views
1

我有一个名为date_created的表列,其中我将datetime值存储在VARCHAR中,例如16-06-2013 10:49:29查找以varchar形式存储的两个日期时间列之间的时间差

我想通过两个日期之间的mysql查询结果。我使用这样的查询:

... WHERE date_created BETWEEN '06-08-2013 22:30:18' AND '28-08-2013 22:30:22' ... 

该查询返回的结果,但这个结果也包括旧的最新记录是每月between 06 and 28。我也使用<和>但这些也没有工作。

我怎样才能得到结果,只有包括记录'06 22时30分十八秒' '28和-08-2013二十二时30分22' 秒

+0

你为什么把它存储在'varchar'中?使用[正确的数据类型](http://dev.mysql.com/doc/refman/5.7/en/datetime.html)。 –

+0

谢谢@MattJohnson。我知道这些数据类型。但是我通过使用VARCHAR进行日期而犯了一个错误。我可以将VARCHAR转换为TIMESTAMP吗? –

+0

你应该做一次迁移你的数据,以便你可以正确查询。如果您在查询过程中尝试这样做,您将无法构建适当的索引,并且性能会受到影响。 –

回答

7

之间-08-2013可以使用MySQL的功能STR_TO_DATE将字符串格式化为DATETIME。

SELECT STR_TO_DATE('06-08-2013 22:30:18', '%d-%m-%Y %H:%i:%s'); 
# 2013-08-06 22:30:18 

我会建议重新格式化所有VARCHAR处理,以日期时间与单一的更新和修复的代码。

+0

将所有VARCHAR重新格式化为DATETIME。什么是单一更新? –

+2

UPDATE ... SET date_created = STR_TO_DATE(date_created,'%d-%m-%Y%H:%i:%s') 此后将此列更改为DATETIME –

1

您需要使用STR_TO_DATE函数将日期字符串转换为可用于比较的日期。

STR_TO_DATE(date_created, '%d-%m-%Y %H:%i:%s') BETWEEN STR_TO_DATE('06-08-2013 22:30:18', '%d-%m-%Y %H:%i:%s') AND STR_TO_DATE('28-08-2013 22:30:22', '%d-%m-%Y %H:%i:%s') 
相关问题