Ada*_*dam 1 java mysql date jdbc
我正在尝试使用开始日期和结束日期作为参数运行查询,该查询可能为null。
MySQL – DB或JDBC驱动程序或两者结合使用–无法处理空值,我的意思是SQL AND endDate <= null排除了每一行。
因此,我尝试使用startDate >= LocalDate.MIN在“无开始日期”中有效的方法。
但endDate <= LocalDate.MAX不允许有任何日期。这是SQL模板:
String strStmt = "SELECT d.forecastId, d.valueDate, d.value " +
"FROM data d " +
"WHERE d.forecastId = ? " +
"AND valueDate >= ? " +
"AND valueDate <= ? " +
Run Code Online (Sandbox Code Playgroud)
这是变量分配:
if (startDate == null) {
statement.setObject(2, LocalDate.MIN);
} else {
statement.setObject(2, startDate.toInstant().atZone(
ZoneId.systemDefault()).toLocalDate());
}
if (endDate == null) {
statement.setObject(3, LocalDate.MAX);
} else {
statement.setObject(3, endDate.toInstant().atZone(
ZoneId.systemDefault()).toLocalDate());
}
try (ResultSet rs = statement.executeQuery()) {
...
Run Code Online (Sandbox Code Playgroud)
这是它产生的SQL(通过P6Spy):
String strStmt = "SELECT d.forecastId, d.valueDate, d.value " +
"FROM data d " +
"WHERE d.forecastId = ? " +
"AND valueDate >= ? " +
"AND valueDate <= ? " +
Run Code Online (Sandbox Code Playgroud)
这行不通,我没有行。
如果我将其更改为不太极端的话:
if (endDate == null) {
statement.setObject(3, LocalDate.parse("2019-01-01"));
...
Run Code Online (Sandbox Code Playgroud)
我在P6Spy日志记录中看到以下内容:
if (startDate == null) {
statement.setObject(2, LocalDate.MIN);
} else {
statement.setObject(2, startDate.toInstant().atZone(
ZoneId.systemDefault()).toLocalDate());
}
if (endDate == null) {
statement.setObject(3, LocalDate.MAX);
} else {
statement.setObject(3, endDate.toInstant().atZone(
ZoneId.systemDefault()).toLocalDate());
}
try (ResultSet rs = statement.executeQuery()) {
...
Run Code Online (Sandbox Code Playgroud)
并且查询工作正常,当然将来会有所例外。
这是MySQL中的某种溢出吗?我应该以LocalDate.MAX其他方式使用还是替代LocalDate.MAX?
我不想回复到
statement.setDate(3, new java.sql.Date(Long.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)
产生以下内容:
SELECT valueDate FROM data d WHERE d.forecastId = 52010
AND valueDate >= '-999999999-01-01'
AND valueDate <= '+999999999-12-31'
Run Code Online (Sandbox Code Playgroud)
哪个都不起作用-可能是Y2K或2038年的错误?P6Spy无法通过以其自己的无用格式显示它而无济于事。
DATEMySQL中超出数据类型的限制DATEMySQL 5.7中的数据类型限制为比该java.time.LocalDate类型小的值范围。引用该文档(重点是我的):
DATE类型用于具有日期部分但没有时间部分的值。MySQL检索并以'YYYY-MM-DD'格式显示DATE值。在支持的范围是“1000年1月1日”到“9999-12-31”。
相反,java.time.LocalDate.MAX日期是+ 999999999-12-31。999999999年远远超过9999年。
如果您的目标是将某个特定日期记录为将来某个未知日期或不确定日期的替身,请选择一个不太远的日期。或者使用NULL,但是Chris Date博士和我都不建议使用NULL。
在各种数据库中,日期时间功能差异很大。SQL标准几乎没有涉及这个主题。因此,您必须仔细阅读特定数据库的文档,以了解该产品的限制和行为。同样,您的JDBC驱动程序。