gpt4 book ai didi

java - 选择7天之前JDBC

转载 作者:行者123 更新时间:2023-11-29 12:55:48 24 4
gpt4 key购买 nike

Im创建一个JDBC到一个餐厅数据库程序,在那里用户可以看到最近7天的利润报告。
我不知道如何选择最后七天,所以程序显示了七天前的总利润。
我想知道如何实现这一点,我的代码如下:

   public static void showSevenDaysAgoSells() {
double value = 0.0;
try {
System.out.println("----Showing last seven days profit----");
PreparedStatement stmt = conn.prepareStatement("SELECT sum(total) FROM sells WHERE date > date_from_7_days_ago");
java.sql.Date date= new java.sql.Date(new java.util.Date().getTime());
stmt.setObject(1, LocalDate.now(ZoneId.of("America/Caracas")).minusWeeks(1));
stmt.executeQuery();
ResultSet rs = stmt.executeQuery();
rs.next();
String sum = rs.getString(1);
value = Double.parseDouble(sum);
System.out.println("DAYS" + "\t" + "TOTAL");
System.out.println(date+ "\t" + sum);
} catch(Exception e) {
e.printStackTrace();
}
}

最佳答案

tl;博士

PreparedStatement stmt = conn.prepareStatement(
"SELECT sum( total_ ) FROM sells_ WHERE date_ > ? ;"
);

…还有…
stmt.setObject(                            // Use JDBC 4.2 method for passing/fetching java.time types.
1 , // Specify which placeholder `?` in PreparedStatement (1, 2, 3, etc.). In this case, `1`.
LocalDate.now( // Get current date (today) in desired/expected time zone.
ZoneId.of( "America/Montreal" )
).minusWeeks( 1 ) // Go back in time a week (7 days).
)

?
将变量 date_from_7_days_ago嵌入到SQL字符串中。因此,它被视为字符串文字,而不是Java变量的传递值。将变量名替换为 ?的问号 PreparedStatement占位符。
PreparedStatement stmt = conn.prepareStatement( "SELECT sum( total_ ) FROM sells_ WHERE date_ > ? ;" );

提示:避免使用保留字(如 datetotal)命名列和其他数据库标识符。各种SQL数据库总共保留了一千多个保留字,所以碰撞比人们想象的要容易。SQL规范明确承诺绝不保留任何带有尾随下划线的单词。因此,命名所有标识符 date_total_,这样就不用担心冲突了。
避免遗留日期时间类
这个问题和另一个答案都使用了麻烦的旧日期时间类,这些类被证明是设计糟糕、令人困惑和有缺陷的。它们现在是遗留的,被java.time类所取代。
java.time.LocalDate类表示一个仅日期的值,不带时间和时区。
时区
这个问题和其他答案都忽略了时区这个关键问题。
在确定日期时,时区是必要的。在任何一个特定的时刻,日期都会因地区而异。例如,在 Paris France午夜后几分钟是新的一天,而在 Montréal Québec中仍然是“昨天”。
continent/region格式指定 proper time zone name,例如 America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,如 ESTIST,因为它们不是真正的时区,不标准,甚至不唯一(!).
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

如果业务逻辑要求指定 UTC而不是特定时区,请使用常量 ZoneOffset.UTC
LocalDate today = LocalDate.now( ZoneOffset.UTC ) ;

要在七天前(一周)获取,让对象计算日期。
LocalDate weekAgo = LocalDate.minusWeeks( 1 );

JDBC公司
如果 JDBC driver符合JDBC 4.2及更高版本,则可以通过 PreparedStatement.setObjectResultSet.getObject直接使用java.time类型。
myPreparedStatement.setObject( … , weekAgo );

并检索:
LocalDate ld = myResultSet.getObject( … , LocalDate.class );

至少这两个Postgres的JDBC驱动程序可能已经针对JDBC4.2进行了更新,不过我还没有测试它们是否支持java.time类型。
The PostgreSQL Global Development Group
pgjdbc-ng
如果您的JDBC驱动程序不符合要求,则返回到使用java.sql。但要尽可能简短地这样做,立即转换到/从java.time。若要转换,请查看添加到旧类中的新方法。在这种情况下,我们必须回到使用 java.sql.DatevalueOftoLocalDate方法。
myPreparedStatement.setObject( … , java.sql.Date.valueOf( weekAgo ) );

并检索:
LocalDate ld = myResultSet.getDate( … ).toLocalDate() ;

关于java.time
java.time框架构建在Java 8和更高版本中。这些类取代了以前麻烦的日期时间类,如 legacyjava.util.Date,& Calendar
现在在 SimpleDateFormat中的 Joda-Time项目建议迁移到 maintenance mode类。
要了解更多信息,请参见 java.time。和搜索堆栈溢出的许多例子和解释。规格为 Oracle Tutorial
在哪里获得java.time类?
JSR 310Java SE 8及更高版本
内置。
包含捆绑实现的标准Java API的一部分。
Java9增加了一些小的特性和修复。
Java SE 9Java SE 6
java.time的大部分功能在 Java SE 7中被移植到Java6&7。
ThreeTen-Backport
Android项目专门为Android改编了ThreeTen Backport(上面提到过)。
ThreeTenABP
How to use ThreeTenABP…项目使用附加类扩展java.time。这个项目是将来可能添加java.time的一个试验场。您可以在这里找到一些有用的类,如 ThreeTen-ExtraIntervalYearWeekYearQuarter

关于java - 选择7天之前JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43579354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com