是否有MySQL设置在应用于“DATE”列时忽略日期时间常量的“时间”部分?

时间:2009-12-01 18:59:26

标签: mysql datetime date

  

免责声明:这是一个旧的和丑陋的代码库所需要的,我宁愿不去触摸。

  • 数据库中有一个表格,其中包含DATE类型的列(以及许多其他列)。
  • java.util.Date参数的查询(由Torque标准自动生成 - 请勿询问); Torque将其格式化为完整日期时间。

因此,MySQL正在获得的查询类似于:

SELECT * FROM my_table
 WHERE my_date = '20091201105320'; // 2009-12-01 10:53:20

问题是在一台具有MySQL 5.0.27标准的服务器上它运行正常 - 就像返回my_tablemy_date设置为'2009-12-01的所有记录一样”。在另一台拥有MySQL 5.0.45的服务器上,它不起作用。数据就在那里 - 如果我在修剪时间部分之后手动运行查询,我会得到正确的结果。

问题是:

在MySQL配置文件或每会话变量(连接字符串)或其他地方是否存在设置,以强制MySQL在字符串常量到日期转换期间忽略时间部分?

我显然不能在不改变代码库的情况下使用DATE()函数,而我更不愿意这样做。

2 个答案:

答案 0 :(得分:1)

显然我运气不好。来自MySQL manual

在MySQL 5.0.42之前,当DATE值与DATETIME值进行比较时,DATETIME值的时间部分将被忽略,或者比较可以作为字符串执行相比。从MySQL开始 5.0.42,通过将时间部分添加为DATE,将DATETIME值强制转换为'00:00:00'类型。

如果有人发现自己处于类似情况,我发现的唯一解决方法是:

  1. java.util.Date实例的时间字段(小时/分钟/秒)重置为零。
  2. 补丁(我的意思是“补丁” - 没有办法插入你自己的适配器)getDateString() Torque的数据库适配器(MySQL org.apache.torque.adapter.DBMM)的方法来检查是否有时间字段date为零,如果是,则使用“date-only”格式。

答案 1 :(得分:1)

这比修补Torque更简单

Criteria cr = new Criteria();
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String fixedDate = dateFormat.format(date);
cr.add("my_date", (Object)("my_date = '" + fixedDate + "'"), Criteria.CUSTOM);