Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQL DB或JDBC驱动程序未处理LocalDate.MAX_Java_Mysql_Date_Jdbc - Fatal编程技术网

Java MySQL DB或JDBC驱动程序未处理LocalDate.MAX

Java 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

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

MySQL——DB或JDBC驱动程序或两者的组合——无法处理空值,我的意思是,SQL
和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()) {
 //...