将java Date与sql TIMESTAMP在同一时区进行比较

时间:2012-04-09 08:00:58

标签: java sql timezone

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

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

userCurrentDate(java中的定义日期)是一个用户保存用户时间和日期的参数。用户可以来自世界各地,因此每个用户都处于不同的时区。

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

如何在 SQL 中的同一时区获得这两个参数?

我试图让他们参加GMT,所以我可以把他们放在同一个基地,像这样:

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

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

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

2 个答案:

答案 0 :(得分:0)

为什么您认为需要这种转换?你有什么版本的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类型中没有这些信息
  3. 只要你只需要将你的Java Date对象与DB值匹配,你就可以没有任何转换。

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

答案 1 :(得分:0)

我在时区oracle函数解决了这个问题。 使用:

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

并相互比较。