我们使用的是带有timestamptz类型的表列的Vertica数据库,所有数据都是根据UTC时区插入的。 我们使用的是spring-jdbc的 NamedParameterJdbcTemplate
所有查询都基于完整的日历日,例如开始日期2013/08/01和结束日期2013/08/31,它将“2013/08/01 00:00:00.0000”和“2013/08/31 23:59:59.9999”之间的所有内容都带来了
我们正在尝试修改我们的查询以考虑时区,即我可以为我当地时区我可以要求'2013/08/01 00:00:00.0000亚洲/耶路撒冷'直到'2013/08/31 23:59 :59.9999亚洲/耶路撒冷',明显不同于'2013/08/01 00:00:00.0000 UTC'至'2013/08/31 23:59:59.9999 UTC'。
到目前为止,我找不到办法,我尝试在会话中设置时区:
将时区设为'亚洲/耶路撒冷';
这甚至不适用于我的数据库客户端。
计算我们的Java代码中的差异对我们不起作用,因为我们还有返回日期分组的查询(这将完全弄乱)。
任何想法或建议?
答案 0 :(得分:3)
好的,显然:
将时区设为“亚洲/耶路撒冷”;
工作,我只是没有意识到这一点,但为了帮助别人,我将添加其他有用的东西:
从my_table选择亚洲/耶路撒冷时区的fiels;
适用于timestamptz字段
答案 1 :(得分:3)
我不熟悉Veritca,但有一些一般建议:
通常最好使用半开间隔进行日期范围查询。开始日期应为包含日期,而结束日期应为独占。换句话说:
start <= date < end
或
start <= date && end > date
您的结束日期不是'2013/08/31 23:59:59.9999'
,而是第二天的开头,或'2013/09/01 00:00:00.0000'
。这避免了与小数精度有关的问题。
该示例用于查找单个日期。由于您要查询一系列日期,因此您有两个输入。所以它会是:
startFieldInDatabase >= yourStartParameter
AND
endFieldInDatabase < yourEndParameter
同样,您首先将结束参数值增加到第二天的开头。
听起来可能是Vertica对TZ有所了解,因为你在答案中谈到了timestamptz
类型。假设它们与Oracle's TIMESTAMPTZ type类似,那么听起来你的解决方案就可以正常工作了。
但通常,如果您在数据库中以UTC格式存储时间,那么您只需提前转换查询输入时间。因此,不是在'2013/08/01 00:00:00.0000'
和'2013/09/01 00:00:00.0000'
之间进行查询,而是提前转换,并在'2013/07/31 21:00:00.0000'
和'2013/08/31 21:00:00.0000'
之间进行查询。关于如何使用Java本地或使用Joda Time进行转换的帖子已经有很多,所以我在此不再重复。
作为旁注,您应确保您使用的任何TZDB实现(Vertica,Java或JodaTime)都具有最新的2013d update,因为其中包含change for Israel's daylight saving time rule今年生效。