gpt4 book ai didi

java - MySQL DB 或 JDBC 驱动程序不处理 LocalDate.MAX

转载 作者:行者123 更新时间:2023-11-29 04:05:17 25 4
gpt4 key购买 nike

我正在尝试运行一个以开始日期和结束日期作为参数的查询,这些参数可能为空。

MySQL - 数据库或 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 <= ? " +

这是变量分配:

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()) {
...

这是它生成的 SQL(通过 P6Spy):

SELECT valueDate FROM data d WHERE d.forecastId = 52010 
AND valueDate >= '-999999999-01-01'
AND valueDate <= '+999999999-12-31'

这不起作用,我没有得到任何行。

如果我然后将其更改为不那么极端的东西:

if (endDate == null) {
statement.setObject(3, LocalDate.parse("2019-01-01"));
...

我在 P6Spy 日志记录中看到以下内容:

SELECT valueDate FROM data d WHERE d.forecastId = 52010 
AND valueDate >= '-999999999-01-01'
AND valueDate <= '2019-01-01'

并且查询工作正常,当然在未来的某个时间点除外。

这是 MySQL 中的某种溢出吗?我应该使用 LocalDate.MAX 吗?不同或者我可以用什么代替 LocalDate.MAX

我不想回到

    statement.setDate(3, new java.sql.Date(Long.MAX_VALUE); 

产生以下内容:

AND valueDate <= '17-Aug-94'

哪个也不起作用 - 也许是 Y2K 或 Year 2038 错误? P6Spy 以其无用的格式显示它并没有帮助。

最佳答案

超出 MySQL 中数据类型 DATE 的限制

数据类型DATE在 MySQL 5.7 中,值的范围比 java.time.LocalDate 小得多。类型。引用该文档(强调我的):

The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.

相比之下,java.time.LocalDate.MAX是日期 +999999999-12-31。 999999999 年远远超过 9999 年。

如果您的目标是记录一个遥远 future 的特定日期作为未知或不确定日期的替代日期,请选择一个不太远的日期。或使用 NULL,但都不使用 Dr. Chris Date我也不推荐使用 NULL。

日期时间功能在各种数据库中差异很大。 SQL 标准几乎没有涉及这个主题。因此,您必须仔细阅读特定数据库的文档以了解该产品的限制和行为。同样,您的 JDBC 驱动程序。

关于java - MySQL DB 或 JDBC 驱动程序不处理 LocalDate.MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46697577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com