我需要在userCurrentDate
与选项列表之间进行比较。
这些选项是数据库中包含时间属性的表(在 oracle 中定义:带有时区的时间戳(6)。每个选项都有自己的时区。
userCurrentDate
(在 java 中定义日期)是一个参数,用于保存用户时间和日期的偏移量。用户可以来自世界各地,因此每个用户都处于不同的时区。
我需要在用户当前日期与选项日期之间进行比较。所以我需要在同一时区获取这两个参数。
如何在 SQL 中在同一时区获取这两个参数?
我试图在格林威治标准时间获得它们,这样我就可以将它们放在同一个基地中,如下所示:
trunc(SYS_EXTRACT_UTC(o.time)) = trunc(sysdate)
但这不是一个好的解决方案。
所以,我需要让他们在同一时区。 如何在SQL命令(或其他解决方案)中获取它?
你为什么认为你需要这种转换?您拥有哪个版本的 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对此进行了测试,它工作正常。
由于Date
和Timestamp
数据类型中没有任何时区信息,因此只要
- 您不需要数据库值实际具有特定的时区。当您在类型
TIMESTAMP WITH TIME ZONE
的列中插入某个值时,JDBC 驱动程序使用您的本地时区。 - 您不需要在 Java 程序中显示原始时区,因为正如我之前所说
Date
/Timestamp
类型中没有该信息。
只要您只需要将 Java Date
对象与数据库值匹配,就应该可以进行任何转换。
另外,请查看这篇关于该主题的综合文章:[如何]从Java使用时区处理Oracle TimeStamp
我用时区预言机函数解决了这个问题。使用:
to_timestamp_tz(to_char(CAST(FROM_TZ(CAST(sysdate AS TIMESTAMP), 'GMT') AT TIME ZONE o.time AS DATE)
并相互比较。