【问题标题】:Compare java Date to sql TIMESTAMP in the same timezone在同一时区将 java Date 与 sql TIMESTAMP 进行比较
【发布时间】:2012-04-21 15:59:03
【问题描述】:

我需要将userCurrentDate 与选项列表进行比较。

选项是数据库中包含时间属性的表(定义:TIMESTAMP(6) WITH TIME ZONE。在oracle中)。每个选项都有他的时区。

userCurrentDate(在java中定义Date)是一个参数,它保存了用户时间和日期的偏移量。用户可以来自世界各地,所以每个用户都在不同的时区。

我需要比较用户当前的 date 和选项 date。 所以我需要在同一时区获取这两个参数。

如何在 SQL 中在同一时区获取这 2 个参数?

我尝试在 GMT 中获取它们,因此我可以将它们获取到相同的基础上,如下所示:

trunc(SYS_EXTRACT_UTC(o.time)) = trunc(sysdate)  

但这不是一个好的解决方案。

所以,我需要让他们在同一个时区。我怎样才能在 SQL 命令(或其他解决方案)中得到它?

【问题讨论】:

  • 我相信 At TIME ZONE 功能是您想要的,如此处所述stackoverflow.com/questions/9216832/…
  • 请注意 Date 对象不处理时区。它仅在格林威治标准时间 70 年 1 月 1 日以来跟踪时间的毫秒数。如果您需要在应用中包含一些基于时间的逻辑,您可能需要使用日历。
  • @Grove,请注意我写了 useCurrentDate 保存用户时间和日期,offset

标签: java sql timezone


【解决方案1】:

您认为为什么需要这种转换?你有什么版本的 Oracle 和 Oracle JDBC?

您是否尝试像这样绑定 userCurrentDate 并执行 SQL:

connection.prepareStatement("select * from options o where o.time = ?")
    .setTimestamp(1, new Timestamp(userCurrentDate.getTime())
    .executeQuery();

我已经用ojdbc14.jar 和Oracle 10g 对此进行了测试,它运行良好。

由于DateTimestamp 数据类型中没有任何时区信息,您实际上不应该关心将时区与DB 值匹配,只要:

  1. 您不需要您的数据库值实际上具有特定 时区。当您在TIMESTAMP WITH TIME ZONE 类型的列中插入一些值时,JDBC 驱动程序将使用您的本地时区。
  2. 您不需要在 Java 程序中显示原始时区,因为正如我之前所说的 Date / Timestamp 类型中没有这些信息。

只要您只需要将您的 Java Date 对象与 DB 值匹配,您就可以无需任何转换。

另外,请查看这篇关于该主题的综合文章:[How To] Handle Oracle TimeStamp with TimeZone from Java

【讨论】:

  • 在我的代码中,它们有时区。这个时区对我的数据库很重要。 o.time 是一个“列表”,我需要将它们中的每一个与?
【解决方案2】:

我用 at time zone oracle 函数解决了这个问题。 使用:

to_timestamp_tz(to_char(CAST(FROM_TZ(CAST(sysdate AS TIMESTAMP), 'GMT') AT TIME ZONE o.time AS DATE) 

并相互比较。

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2012-01-04
    • 2021-09-22
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多