免责声明:这是一个旧的和丑陋的代码库所需要的,我宁愿不去触摸。
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_table
中my_date
设置为'2009-12-01的所有记录一样”。在另一台拥有MySQL 5.0.45的服务器上,它不起作用。数据就在那里 - 如果我在修剪时间部分之后手动运行查询,我会得到正确的结果。
问题是:
在MySQL配置文件或每会话变量(连接字符串)或其他地方是否存在设置,以强制MySQL在字符串常量到日期转换期间忽略时间部分?
我显然不能在不改变代码库的情况下使用DATE()
函数,而我更不愿意这样做。
答案 0 :(得分:1)
显然我运气不好。来自MySQL manual:
在MySQL 5.0.42之前,当DATE
值与DATETIME
值进行比较时,DATETIME
值的时间部分将被忽略,或者比较可以作为字符串执行相比。从MySQL开始
5.0.42,通过将时间部分添加为DATE
,将DATETIME
值强制转换为'00:00:00'
类型。
如果有人发现自己处于类似情况,我发现的唯一解决方法是:
java.util.Date
实例的时间字段(小时/分钟/秒)重置为零。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);