如何在postgres中获取2个时间戳之间的所有数据?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (370)

我在postgres中有2个时间戳文件,我在java中将这两个字段表示为日期字段。开始时间 - > oct 14 10 pm结束时间 - > oct 14 11 pm如果我将值传递为“oct 14 10.30 pm”然后我必须所有行的开始时间大于我传递的值并且结束时间小于我传递的值

提问于
用户回答回答于

tl;博士

>= AND <从不使用半开放式方法,逻辑,跨越时间BETWEEN

逻辑错误

开始时间 - > oct 14 10 pm结束时间 - > oct 14 11 pm ...然后我必须所有行的开始时间大于我的传递值和结束时间小于我传递的值

这个逻辑不正确。使用这样的逻辑进行这样的每小时报告,当时钟达到一小时时,您将永远不会报告碰巧记录的项目。永远不会找到正好在上午10点(10:00:00.0)或11点准确(11:00:00.0)的值的行。

半开

我建议一致地使用半开放方法来定义时间跨度。在这种方法中,开头是包容性的,而结尾是独占的。例如,小时从上午10点开始的第一个时刻开始,并在时钟到达上午11点时运行,但不包括。

使用这种方法,我将提供一系列每小时查询以查找所有行。任何行都不会像你的逻辑一样消失。

SELECT * 
FROM event_
WHERE when_ >= ?
AND when_ < ?
;

换句话说,永远不要使用BETWEEN时间跨度。改用>= AND <逻辑。

时区

如果谈论实际时刻,如果谈论SQL标准列类型,时区问题是至关重要的TIMESTAMP WITH TIME ZONE

在你的例子中,你的意思是法国巴黎上午10点?或者几个小时后在蒙特利尔魁北克上午10点?或者早上10点在加尔各答印度,几个小时前?

在Java中,使用类的时区将您的条件定义为时刻ZonedDateTime

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
LocalDate ld = LocalDate.of( 2018 , 10 , 14 ) ;
LocalTime lt = LocalTime.of( 10 , 0 ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

要在UTC中查看相同的时刻,请提取Instant

Instant instant = zdt.toInstant() ;

生成以标准ISO 8601格式表示其值的文本。

String output = instant.toString() ;   // Generate text in standard ISO 8601 format. 

使用符合JDBC 4.2或更高版本的JDBC驱动程序将其传递到预准备语句中的SQL查询。

myPreparedStatement.setObject( 1 , zdtStart ) ;
myPreparedStatement.setObject( 2 , zdtStop ) ;

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要课程。java.sql.*

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此比如找到一些有用的类IntervalYearWeekYearQuarter,和更多

用户回答回答于

BETWEEN PSQL中的子句对你很有用。

SELECT * 
FROM table 
WHERE <your_date_column> BETWEEN <Start_time> AND <END_TIME>

上面的where子句将为您提供位于指定范围之间的所有行。

只需通过传递给它的变量通过Java代码调用此查询。

扫码关注云+社区

领取腾讯云代金券