2012-10-04 109 views
1

我有一列有像2012-09-09 13:20:00这样的数据,当我尝试查询表时,使用以下查询,它不包含数据迄今为止。将mySQL的默认时间从00:00:00更改为23:59:59

Procedure test (IN fromdate date, IN todate date) 

Select * from table where date between fromdate and todate 

比方说,用户投入到2012-08-102012-09-09,那么它不包括在9月9日的数据。但是,如果我改变了迄今为2012-09-10,那么它将包含数据。似乎没有时间,mySQL默认为午夜或00:00:00

有没有办法改变它或解决这个问题?比如,在某个阶段加入时间(23:59:59)到todate?即使用以下

set todate = todate.STR_TO_DATE("23:59:59"); 

回答

1

您应该使用><运营商而不是BETWEEN,因为它不包括日期(假设您的列是datetime)。如果您只指定2011-01-31,则相当于2011-01-31 00:00:00

例子:

SELECT * FROM t1 WHERE date > DATE_SUB(fromdate, INTERVAL 1 SECOND) 
    AND date < DATE_ADD(todate, INTERVAL 1 DAY) 

看到它在action

+0

我不确定语法(todate + 1)是否正确,我试过这个,但它不返回任何东西。顺便说一句,你是对的,列是日期时间,用户输入是日期类型。 – Will

+0

@Will这是伪代码,请参阅我的实际代码更新。 – Kermit

+0

非常感谢您的帮助。对不起,我正在愚蠢。 – Will

1

慢 - 强迫列DATE类型:

... WHERE DATE(column_yyyymmddhhmmss) BETWEEN fromdate AND todate 

更快 - 强迫上限为DATETIME,包括一天的最后一秒:

... WHERE column_yyyymmddhhmmss BETWEEN user_fromdate AND CONCAT(user_todate, '23:59:59'); 
+0

我相信这会禁止有效利用该列的任何索引。 – Kermit

+0

@njk ach!我误解了问题,交换了列和用户输入 – pilcrow

+0

已更新的答案。 – pilcrow