Java MySQL DB或JDBC驱动程序未处理LocalDate.MAX
我正在尝试运行一个以开始日期和结束日期为参数的查询,该参数可能为空 MySQL——DB或JDBC驱动程序或两者的组合——无法处理空值,我的意思是,SQLJava MySQL DB或JDBC驱动程序未处理LocalDate.MAX,java,mysql,date,jdbc,Java,Mysql,Date,Jdbc,我正在尝试运行一个以开始日期和结束日期为参数的查询,该参数可能为空 MySQL——DB或JDBC驱动程序或两者的组合——无法处理空值,我的意思是,SQL和endDate=LocalDate.MIN对于“无开始日期”非常有效 但是endDate='-9999999-01-01' 和valueDate假设您不打算筛选出valueDate中具有null值的行,那么您似乎试图创建一个条件,当查询中的开始日期或结束日期为null时,该条件的计算结果总是true。我认为通过动态生成SQL,省略nullend
和endDate=LocalDate.MIN
对于“无开始日期”非常有效
但是endDate='-9999999-01-01'
和valueDate假设您不打算筛选出valueDate
中具有null
值的行,那么您似乎试图创建一个条件,当查询中的开始日期或结束日期为null
时,该条件的计算结果总是true
。我认为通过动态生成SQL,省略null
end/start date案例中的(冗余)比较会更简单:
String strStmt = "SELECT d.forecastId, d.valueDate, d.value " +
"FROM data d " +
"WHERE d.forecastId = ? ";
if (startDate != null) {
strStmt += "AND valueDate >= ? ";
}
if (endDate != null) {
strStmt += "AND valueDate <= ?";
}
假设您不打算筛选出valueDate
中具有null
值的行,那么您似乎试图创建一个条件,当查询中的开始日期或结束日期为null
时,该条件的计算结果总是true
。我认为通过动态生成SQL,省略null
end/start date案例中的(冗余)比较会更简单:
String strStmt = "SELECT d.forecastId, d.valueDate, d.value " +
"FROM data d " +
"WHERE d.forecastId = ? ";
if (startDate != null) {
strStmt += "AND valueDate >= ? ";
}
if (endDate != null) {
strStmt += "AND valueDate <= ?";
}
超过MySQL中数据类型DATE
的限制
MySQL 5.7中的数据类型限制为比类型小得多的值范围。引用该文件(我的重点):
日期类型用于包含日期部分但不包含时间部分的值。MySQL以“YYYY-MM-DD”格式检索并显示日期值。支持的范围为“1000-01-01”到“9999-12-31”
相反,是日期+9999999-12-31。999999999年远远超过9999年
如果你的目标是在遥远的将来记录一个特定的日期,作为未知或不确定日期的替身,选择一个不太遥远的日期。或者使用NULL,但我也不建议使用NULL
日期时间功能在各种数据库中差异很大。SQL标准几乎没有涉及这个主题。因此,您必须仔细阅读特定数据库的文档,以了解该产品的限制和行为。同样,您的JDBC驱动程序。超出了MySQL中数据类型DATE
的限制
MySQL 5.7中的数据类型限制为比类型小得多的值范围。引用该文件(我的重点):
日期类型用于包含日期部分但不包含时间部分的值。MySQL以“YYYY-MM-DD”格式检索并显示日期值。支持的范围为“1000-01-01”到“9999-12-31”
相反,是日期+9999999-12-31。999999999年远远超过9999年
如果你的目标是在遥远的将来记录一个特定的日期,作为未知或不确定日期的替身,选择一个不太遥远的日期。或者使用NULL,但我也不建议使用NULL
日期时间功能在各种数据库中差异很大。SQL标准几乎没有涉及这个主题。因此,您必须仔细阅读特定数据库的文档,以了解该产品的限制和行为。同样,您的JDBC驱动程序。您是否可以更改查询本身,即如果日期不为空,则仅动态包含其他日期比较?阅读文档?支持的范围为“1000-01-01”到“9999-12-31”。与您的问题无关,但Connector/J 6.0.4是Connector/J的废弃版本6的开发版本,它不是可用于生产的版本。最新发布的版本是5.1.44。最新的开发版本是8.0.8(但该版本还没有投入生产!)@markrotterveel哦,对了。我刚刚抓取了6.0.6,因为IntelliJ auto在pom.xml中完成了它。我在mysql bugzilla中的字符编码和相关错误的同时遇到了一些其他问题,所以我尝试对其进行更改,但IntelliJ似乎仍然坚持使用它的JAR,这使得更改版本变得单调乏味。我现在正在试用mariadb connector/j 2.1.2是否可以更改查询本身,即,如果日期不为空,则动态仅包括其他日期比较?阅读文档?支持的范围为“1000-01-01”到“9999-12-31”。与您的问题无关,但Connector/J 6.0.4是Connector/J的废弃版本6的开发版本,它不是可用于生产的版本。最新发布的版本是5.1.44。最新的开发版本是8.0.8(但该版本还没有投入生产!)@markrotterveel哦,对了。我刚刚抓取了6.0.6,因为IntelliJ auto在pom.xml中完成了它。我在mysql bugzilla中的字符编码和相关错误的同时遇到了一些其他问题,所以我尝试对其进行更改,但IntelliJ似乎仍然坚持使用它的JAR,这使得更改版本变得单调乏味。我现在正在试用mariadb connector/j 2.1.2Nice post:)我正在开发的应用程序是一个预测应用程序,为Excel加载项、Python、r和其他客户端提供服务。我们运行的一个负载测试(承认不是为了实际使用)涉及到在未来每天添加250000个日期(2684)。我想9999在未来是不可思议的遥远,但是没有太多的努力,我们已经有四分之一的路要走了。我将看看是否可以在JDBC库中找到一个MySQL max date常量,以替代LocalDate.max。如果应用程序被重新编写,我想放弃日期类型是有意义的。我看到没有BIGDATE.Nice post:)我正在开发的应用程序是一个预测应用程序,它为Excel外接程序、Python、r和其他客户端提供服务。我们运行的一个负载测试(承认不是为了实际使用)涉及到在未来每天添加250000个日期(2684)。我想9999在未来是不可思议的遥远,但是没有太多的努力,我们已经有四分之一的路要走了。我将看看是否可以在JDBC库中找到一个MySQL max date常量,以替代LocalDate.max。如果这个应用程序被重新编写,我想它会
if (endDate == null) {
statement.setObject(3, LocalDate.parse("2019-01-01"));
...
statement.setDate(3, new java.sql.Date(Long.MAX_VALUE);
String strStmt = "SELECT d.forecastId, d.valueDate, d.value " +
"FROM data d " +
"WHERE d.forecastId = ? ";
if (startDate != null) {
strStmt += "AND valueDate >= ? ";
}
if (endDate != null) {
strStmt += "AND valueDate <= ?";
}
int index = 1;
statement.setInt(index++, forecastId);
if (startDate != null) {
statement.setObject(index++, startDate.toInstant().atZone(
ZoneId.systemDefault()).toLocalDate());
}
if (endDate != null) {
statement.setObject(index, endDate.toInstant().atZone(
ZoneId.systemDefault()).toLocalDate());
}
try (ResultSet rs = statement.executeQuery()) {
//...