获取日期之间的数据

时间:2017-07-28 12:09:00

标签: java sql database mariadb

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

5 个答案:

答案 0 :(得分:1)

日期时间类型

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

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

半开逻辑

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

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

SQL命令BETWEEN是“关闭”意味着开头和结尾都包含在内;不适合日期工作。

将字符串解析为日期时间

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

SQL&amp; 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标准明确承诺永远不会使用尾随下划线。

答案 1 :(得分:0)

使用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 :(得分:0)

尝试输入日期'date1'。

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

答案 3 :(得分:0)

您可以尝试使用'BETWEEN'。

例子:

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

我希望我能帮到你。

答案 4 :(得分:0)

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

  • 来自JAVA代码段的正确日期格式
  • 在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);