【问题标题】:Get data between the dates获取日期之间的数据
【发布时间】:2017-07-28 12:08:59
【问题描述】:
String Date1 = (((JTextField)jDateChooser1.getDateEditor().getUiComponent()).getText());
String Date2 = (((JTextField)jDateChooser2.getDateEditor().getUiComponent()).getText());

String query="SELECT * FROM work_hours WHERE ID ="+A+" AND Date >= "+Date1+" AND Date <= "+Date2+" ";
ResultSet rs = db.Select(query);

这里的 Date1 和 Date2 是 Jdatechooser,取自用户。

 Error:   
 You have an error in your SQL syntax; check the manual that
 corresponds to your MariaDB server version for the right syntax to use
 near 'Date >= Jun 12, 2017 Date <= Jun 14, 2017' at line 1

【问题讨论】:

  • 您的 SQL 语法有误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“日期 >= 2017 年 6 月 12 日之间的日期

标签: java sql database mariadb


【解决方案1】:

使用STR_TO_DATE函数;

String query="SELECT * FROM work_hours WHERE ID ="+A+" AND Date >= STR_TO_DATE("+Date1+") AND Date <= STR_TO_DATE("+Date2+") ";

【讨论】:

  • 我不确定您是否应该在日期前后添加单引号。
  • 如何将字符串转换为日期
【解决方案2】:

日期时间类型

对于日期时间值,使用日期时间数据类型来定义列,并使用 Java 中的日期时间类。 JDBC 驱动程序的工作是在这些类型之间进行调解。

您正在尝试传递字符串而不是日期时间对象。

半开逻辑

在日期时间工作中,使用半开方法,其中开头包含,结尾不包含。所以午餐从中午开始,一直持续到但不包括下午 1 点的第一刻。一周从星期一开始,一直持续到但确实包括下一个星期一。

SELECT * FROM tbl_
WHERE when_ >= ?   -- Pass start moment. Inclusive.
AND   when_  < ?   -- Pass stop moment.  Exclusive.
;

SQL 命令 BETWEEN 是“封闭的”,意味着开头和结尾都包含在内;不适合约会时间的工作。

将字符串解析为日期时间

您需要将用户输入转换为日期时间对象。您可能希望按用户解析字符串类型。或者您可能想要使用日期时间小部件。在您的情况下,显然需要解析字符串。在 Stack Overflow 中搜索 DateTimeFormatter 以查找数百个现有问题和答案。

SQL 和 JDBC

Java 中的Instant 类代表UTC 时间轴上的一个时刻。等效于传统的java.util.Date 类,但具有更精细的纳秒分辨率而不是毫秒。

应用时区ZoneId 来获取ZonedDateTime 对象。等效于旧类GregorianCalendar

ZonedDateTime zdt = ZonedDateTime.parse( input , … ) ;
myPreparedStatement.setObject( … , zdt.toInstant() ) ;

还有……

Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( ZoneId.of( "America/Montreal" ) ) ;

提示

遵守命名约定。在 Java 中,变量以小写字母开头。

避免使用保留字命名数据库中的列。完全避免所有保留字的最简单方法是在所有数据库对象的所有名称后面附加一个下划线。 SQL 标准明确承诺从不使用尾随下划线。

【讨论】:

    【解决方案3】:

    尝试引用日期“date1”。

    String query="SELECT * FROM work_hours WHERE ID ="+A+" 
    AND Date >= '"+Date1+"' AND Date <= '"+Date2+"' "; 
    

    【讨论】:

    • 运行但不检索数据
    【解决方案4】:

    您可以尝试使用“BETWEEN”。

    例:

    SELECT * FROM table_name WHERE date BETWEEN '2017-07-01 07:07:07' AND '2017-07-31 07:07:07';

    希望能帮到你。

    【讨论】:

    • 您的 SQL 语法有误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“2017 年 12 月和 2017 年 6 月 14 日”附近使用正确的语法
    • 我想你忘记了 SQL 查询中日期附近的'
    • SQL 命令BETWEEN 是“封闭的”,意味着开头和结尾都包含在内。这不是最适合日期时间工作的。在日期时间工作中,使用半开方法,开始是inclusive,而结束是exclusive。所以午餐从中午开始,一直持续到但不包括下午 1 点的第一刻。一周从星期一开始,一直持续到(但包括)下一个星期一。
    【解决方案5】:

    要解决此问题,您需要完成以下步骤:

    • 来自 JAVA sn-p 的正确日期格式
    • 在 SQL 脚本中添加单引号包裹日期

    我不确定您如何格式化日期变量 en JAVA 以返回 ANSI 日期标准“YYYYMMDD”

    SQL 脚本需要如下所示:

    String query="SELECT * FROM work_hours WHERE ID ="+A+" AND Date >= '"+Date1+"' AND Date <= '"+Date2+"' ";
    ResultSet rs = db.Select(query);
    

    【讨论】:

    • SimpleDateFormat 类是麻烦的旧日期时间类的一部分,现在被 java.time 类所取代。
    • @BasilBourque 感谢您的澄清,我会删除它
    猜你喜欢
    • 2019-04-19
    • 2015-05-15
    • 1970-01-01
    • 2016-04-17
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多