当前位置: 首页 > 知识库问答 >
问题:

当参数在PostgreSQL中是“没有时区的时间戳”时,Java中的参数类型应该是什么?

终睿
2023-03-14

BTW从表中选择COUNT(*),其中activitydate>'2014-11-20'和activitydate<'2014-11-21'和zipcode=12345在pgadmin中运行完美。

public Response query(
          @QueryParam("start_date") String start_date,
          @QueryParam("end_date") String end_date,
          @QueryParam("zipcode") String zipcode
          ) throws Exception {
...
...

pstmt = conn.prepareStatement("SELECT COUNT(*) FROM table WHERE activitydate > ? AND activitydate < ? AND zipcode = ?");

pstmt.setString(1, start_date); 
pstmt.setString(2, end_date); 
pstmt.setString(3, zipcode); 

更新:我将其更改为java.sql.timestamp,但仍然不起作用:

public Response query(
          @QueryParam("start_date") Timestamp start_date,
          @QueryParam("end_date") Timestamp end_date,
          @QueryParam("zipcode") String zipcode
          ) throws Exception {
...
...

pstmt = conn.prepareStatement("SELECT COUNT(*) FROM table WHERE activitydate > ? AND activitydate < ? AND zipcode = ?");

pstmt.setTimestamp(1, start_date); 
pstmt.setTimestamp(2, end_date); 
pstmt.setString(3, zipcode);

共有1个答案

孙书
2023-03-14

对于使用半开时间跨度的SQL:
“选择*FROM tbl WHERE when!<?和when<?;”

myPreparedStatement.setObject(       // Use a prepared statement so you can pass smart objects rather than dumb strings.
    1 ,                              // Specify which placeholder is being fulfilled.
    LocalDate                        // Represent a date-only value, without time-of-day and without time zone or offset-from-UTC.
    .parse( "2014-11-20" )           // Parse an input string in standard ISO 8601 format to get a `LocalDate` object.
    .atStartOfDay()                  // Determine the first moment of the day on that date. Returns a `LocalDateTime` object representing a date with time-of-day but lacking any concept of time zone or offset-from-UTC.
) ;
myPreparedStatement.setObject( 
    2 , 
    LocalDate
    .parse( "2014-11-21" )
    .atStartOfDay()
) ;

当心:我猜您在数据库中的列使用了错误的类型。只能用带时区的时间戳跟踪时刻,而不能用不带时区的时间戳跟踪时刻。搜索堆栈溢出以获取更多信息。

延斯的答案现在已经过时了。现在,您应该使用现代的java.time类来取代麻烦的旧遗留date-time类。

不,错误的数据类型。除了是遗留的并且在设计上存在严重缺陷之外,java.sql.timestamp类还表示一个时刻,即时间线上的一个特定点。因此,这与您的Timestamp类型没有时区的列不匹配。

您应该使用LocalDateTime类。该类表示具有一天中的时间的日期,但缺少任何偏移量或时区的概念。

若要从数据库中检索值,请执行以下操作。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
myPreparedStatement.setObject( … , ldt ) ;

为了解决具有时间的日期问题,我们需要确定一天的开始时间。使用LocalDateTime,我们没有要解释的时区异常。所以一天总是在00:00开始。不过,我们应该养成让java.time确定一天的开始时间的习惯。

LocalDate startDate = LocalDate.parse( "2014-11-20" ) ;
LocalDate stopDate = LocalDate.parse( "2014-11-21" ) ;

LocalDateTime start = startDate.atStartOfDay() ;
LocalDateTime stop = stopDate.atStartOfDay() ;

用占位符编写SQL。

我建议你改变你的想法,养成半开放的方法来定义时间跨度的习惯。在半开放中,开始是包容的,而结束是排他的。因此,对于20日的整个一天,搜索等于或晚于20日的日期,以及直到但不包括21日的日期。至于第一部分,“等于或更晚”的一种更短的表达方式是“不在之前”,所以我们使用!<

String sql = "SELECT * FROM tbl WHERE when !< ? AND when < ? ; " ;
myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;
 类似资料:
  • 我是DynamoDB的新手。我希望创建一个使用DeviceID作为哈希键、Timestamp作为范围键和一些数据的表。 在SQL中,我们可以为Timestamp使用datetime类型,但在DynamoDB中没有。 对于所选的数据类型,我应该使用什么样的时间戳格式?ISO格式(例如:2016-11-11T17:21:07.5272333Z)或纪元时间(例如:1478943038816)? 我需要在

  • Postgresql似乎转换了PreparedStatement的timestamp参数,我使用settimestamp设置了这个参数。 “我想做的事” [奇怪的事] 使用调试工具,我检查了pstmt值。奇怪的是,被添加到我的参数中。 pstmt=>SELECT*FROM some_table WHERE update_time bether beather bether bether bethe

  • 问题内容: 在Go中,对于time.Now()得到的时间戳记以 m = xx.xxxx … 结尾,这意味着 m ? 如何在打印时将其删除,或者是否有其他方法或功能来获取没有 m的* 时间戳 * 例如:-for time.Now()获取输出=> 2009-11-10 23:00:00 +0000 UTC m = + 0.000000001 但是我需要这样的输出=> 2009-11-10 23:00:

  • 问题内容: 我想将一列数据从文本更改为时间戳类型。我的数据中没有时区。我的数据格式类似于28-03-17 17:22,包括时间和日期,但没有时区。换句话说,我所有的数据都在同一时区。我该怎么做? 我在下面尝试了多种方法,但仍然找不到正确的方法。希望您能够帮助我。 当然,如果可以解决我的问题,我可以建立一个新表。 问题答案: 如果TEXT类型的文本具有有效的日期值,则按以下步骤进行更改会更容易(建议

  • 错误[42883]错误:函数datediff(未知,没有时区的时间戳,没有时区的时间戳)不存在提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。职位:36

  • 问题内容: 我刚刚了解了这种美观的语法 用可能是类型的元素来清空。Java的源代码如下所示: 现在,如果我以这种方式编写了一个泛型类型不出现在参数列表中的方法,那么有什么方法可以访问成为的实际类呢? 我的意思是,到目前为止,我编码同一件事的方法是 如果删除了-parameter,我将无法执行。显然我可以 但这给了我通常的警告。好的,在这里有帮助,但是实际上我想对方法的预期返回类型做些事情。如果我添