【问题标题】:Convert sysdate to BST(British Summer Time)将 sysdate 转换为 BST(英国夏令时)
【发布时间】:2020-09-16 06:46:54
【问题描述】:

我有一个 Java api,它从位于 ET 时区的 oracle 数据库中获取数据。我想在 2 列上使用 sysdate 查询该表,但应选择 sysdate 作为当前 BST 日期值而不是 ET 日期值。

select * from customers where sysdate between mem_registered_date and mem_deregistered_date;

如何做到这一点?请帮忙

【问题讨论】:

  • 查看此帖子/答案 -> stackoverflow.com/a/22935120/3715100
  • 哇,我不知道孟加拉国标准时间这么受欢迎。
  • @MattJohnson-Pint 已编辑 :)
  • 您的列的数据类型究竟是什么?
  • @BasilBourque 列的数据类型为 DATE

标签: sql oracle date timezone


【解决方案1】:

在时区之间进行转换的最简单方法是使用能够理解时区的数据类型TIMESTAMP。然后,当您转换为所需的时区时,然后将 CAST 转换回 DATE 数据类型:

SELECT *
FROM   customers
WHERE  CAST( SYSTIMESTAMP AT TIME ZONE 'Europe/London' AS DATE )
         BETWEEN mem_registered_date AND mem_deregistered_date;

我假设您想要英国的当前时间(夏季为 BST,冬季为 GMT),如果您想要时区 UTC+1,请使用:

CAST( SYSTIMESTAMP AT TIME ZONE '+01:00' AS DATE )

【讨论】:

    【解决方案2】:

    如果查询具有仅日期值的列,没有任何时间或任何时区,即类似于 SQL 标准 DATE 类型的列,则使用 Java 类 @ 987654323@。

    通常最好使用半开的时间跨度定义,其中开始是包含的,而结尾是排除的。这允许跨度几乎彼此邻接而没有间隙或重叠。因此,切勿将 SQL 命令 BETWEEN 用于日期时间范围,因为它是完全封闭的(包括开头和结尾)。

    获取特定地区(时区)的人们使用的挂钟时间所显示的今天日期。

    BST 不是实时时区。对于英国时间,请使用Europe/London。

    ZoneId z = ZoneId.of( "Europe/London" ) ;
    LocalDate today = LocalDate.now( z ) ;
    

    SQL 将如下所示:

    SELECT * 
    FROM event_ 
    WHERE ? >= start_
    AND ? < end_
    ;
    

    填写占位符。

    myPreparedStatement.setObject( 1 , today ) ;
    myPreparedStatement.setObject( 2 , today ) ;
    

    将数据库中的日期值加载到 Java 中。

    LocalDate start = myResultSet.getObject( … , LocalDate.class ) ;
    

    TIMESTAMP WITHOUT TIME ZONE

    Oracle 数据库中命名错误的DATE 实际上表示一个具有日期时间的日期,而没有时区上下文或与UTC 的偏移量。因此,这种类型不能代表时刻,时间线上的特定点。如果值是明年 1 月 23 日中午,我们无法知道那是东京、图卢兹还是托莱多的中午——所有不同的时刻相隔几个小时。这个DATE 类型类似于SQL 标准类型TIMESTAMP WITHOUT TIME ZONE。

    因此,对于这种数据类型,您询问时区的问题毫无意义。苹果和橘子。涉及时区意味着您正在跟踪时刻,时间线上的特定点。但是 Oracle DATE 不能代表上面讨论的时刻。

    要跟踪时刻,您应该使用类似于 SQL 标准 TIMESTAMP WITH TIME ZONE 类型的列。

    【讨论】:

    • LocalDate 只有年-月-日组件;在 Oracle 中,DATE 数据类型具有年-月-日-时-分-秒组件。此外,!&lt; 不是 Oracle 中的有效运算符;你想要&gt;=。
    • @MT0 我添加了一个关于该类型的部分,因为 OP 已经明确识别了该类型。
    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2012-09-12
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多