【问题标题】:SQL statement in Java to sort by date (month)Java中的SQL语句按日期(月)排序
【发布时间】:2017-04-08 12:11:11
【问题描述】:

我的 Android 项目中有一个 SQL 表,其中有一个 日期 格式的 KEY_DATE 字段。

KEY_DATE + "DATE,"

我的表格由 java 代码填充(日期为 dd/mm/yy 格式)。 所以现在我需要进行几个与日期相关的查询,但有些东西不起作用。 我需要从一张表中选择今天、这个月和今年。 这是我尝试过的:

     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
     Date todayD = new Date();
     dateFormat.format(todayD);
     String today = dateFormat.format(todayD);

     Calendar cal = Calendar.getInstance();
     cal.set(Calendar.DAY_OF_MONTH, 1);
     Date firstDay = cal.getTime();
     dateFormat.format(firstDay); 

    String selectQuery = "SELECT  * FROM " + TABLE_PAYMENTS + "WHERE " 
    +  KEY_DATE +" BETWEEN " + firstDay + " AND " + today;

即使该期间有很多数据,查询也会返回空。 我相信这里的数据格式有问题。你能帮我解决这个问题吗? 提前谢谢你。

【问题讨论】:

  • 打印出selectQuery,答案应该很明显了。
  • 我建议在编写查询时始终使用 ISO 格式的日期 (yyyy-MM-dd)。您也应该引用日期,否则它将被解释为除法运算。而在处理日期范围时,最好使用“date >= firstDay and date

标签: java android mysql sql calendar


【解决方案1】:
  1. 你没有格式化firstD,所以你只能从当月的第一天当前时间开始;
  2. 您应该在查询中的日期周围使用单引号或使用准备好的语句,否则您的服务器会将您的日期理解为数学运算;
  3. 查询日期范围时,请记住,如果您没有指定日期的小时,SQL 将默认将其视为零小时 (0:00:00.0000)。如果您使用“在 startDate 和今天之间”,您只会得到今天的午夜。如果你使用“在 startDate 和明天之间”,你也会得到明天的午夜。您应该使用“日期>=开始日期和日期
  4. 在编写带有日期的查询时,我总是喜欢使用 ISO 格式的日期字符串:yyyy-MM-dd。

    日历 cal = Calendar.getInstance(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    今天日期D = new Date(); cal.setTime(今天 D); cal.add(日历.DATE, 1); 明天的日期D = cal.getTime(); String today = dateFormat.format(tomorrowD);

    cal.set(Calendar.DAY_OF_MONTH, 1); 日期 firstD = cal.getTime(); String firstDay = dateFormat.format(firstD);

    String selectQuery = "SELECT * FROM TABLE_PAYMENTS WHERE KEY_DATE >= '" + firstDay + "' AND KEY_DATE

【讨论】:

  • #3 项被称为“半开放”方法,其中开头是inclusive,而结尾是exclusive。定义时间跨度的明智方法。
【解决方案2】:

问题在于数据库中存在的数据的日期格式以及您传递(字符串)到 sql 查询的日期格式。

日期作为字符串参数传递给sql查询不是一个好习惯,所以我强烈建议使用preparedStatement,如下所示:

Date todayD = new Date();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1);
Date firstDay = cal.getTime();
String selectQuery = "SELECT  * FROM TABLE_PAYMENTS WHERE BETWEEN ? AND ?" ;

//create preparedStatement here

preparedStatement.setDate(1, firstDay);
preparedStatement.setDate(2, todayD);

【讨论】:

  • 很好的答案,除了使用麻烦的旧日期时间类型。符合 JDBC 4.2 及更高版本的 JDBC 驱动程序可以通过 ResultSet::getObjectPreparedStatement::setObject 方法直接处理 java.time 类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2012-05-25
  • 2013-09-09
  • 1970-01-01
相关资源
最近更新 更多