我需要将userCurrentDate
与选项列表进行比较。
选项是数据库中包含time属性的表(定义:TIMESTAMP(6)WITH TIME ZONE。在oracle中)。每个选项都有他的时区。
userCurrentDate
(java中的定义日期)是一个用户保存用户时间和日期的参数。用户可以来自世界各地,因此每个用户都处于不同的时区。
我需要将用户当前日期与选项日期进行比较。 所以我需要在同一时区获得这两个参数。
如何在 SQL 中的同一时区获得这两个参数?
我试图让他们参加GMT,所以我可以把他们放在同一个基地,像这样:
trunc(SYS_EXTRACT_UTC(o.time)) = trunc(sysdate)
但它不是一个好的解决方案。
所以,我需要在同一时区内获取它们。我怎样才能在SQL命令(或其他解决方案)中获得它?
答案 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进行了测试,它运行正常。
由于Date
和Timestamp
数据类型中没有任何时区信息,因此您实际上不应该关心将时区与DB值匹配,只要:
TIMESTAMP WITH TIME ZONE
的列中插入一些值时,JDBC驱动程序将使用您的本地时区。Date
/ Timestamp
类型中没有这些信息只要你只需要将你的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)
并相互比较。