2

我需要比较userCurrentDate选项列表。

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

( userCurrentDatedefinition Date. in java) 是一个参数,用于保存用户时间和日期以及偏移量。用户可以来自世界各地,因此每个用户都在不同的时区。

我需要将用户当前日期 与选项日期进行比较。所以我需要在同一时区获取这两个参数。

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

我试图让它们在格林威治标准时间,所以我可以让它们在同一个基地,像这样:

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

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

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

4

2 回答 2

0

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

您是否尝试仅绑定userCurrentDate和执行 SQL,如下所示:

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

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

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

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

只要您只需要将 JavaDate对象与 DB 值匹配,您就可以不用任何转换。

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

于 2012-04-10T13:51:57.000 回答
0

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

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

并将其相互比较。

于 2012-05-15T14:38:18.770 回答