如何在我的oracle数据库中使用TimeZone
问题描述:
处理SQL-Month查询我有一列BEGIN
,它的类型为DATE
。我曾经用TimeZone Europe/Berlin
存储日期。现在我们需要切换到UTC
。如何在我的oracle数据库中使用TimeZone
我的问题是:通常日期保存这样
01.02.2017 00:00:00 (DD.MM.YYYY)
时,我选择了每月select to_char(begin, 'MM')
我02
- 罚款。
由于我们现在将日期存储为UTC,因此上述日期将被存储为31.01.17 23:00:00
,并且当我现在选择月份时,我将获得01
而不是02
。
我真的不知道如何解决这个问题。我是否需要调整我的整个查询,如下所示:
select to_char(CONVERT_TO_EUROPE_BERLIN(begin), 'MM')
??
答
你可以使用SYS_EXTRACT_UTC
在WHERE条件将是这样的:
WHERE BEGIN = CAST(SYS_EXTRACT_UTC(FROM_TZ(CAST({given local time} AS TIMESTAMP), 'Europe/Berlin')) AS DATE)
它周围的其他方法可能是这样的:
select to_char(CAST(FROM_TZ(CAST(BEGIN AS TIMESTAMP), 'UTC') AT TIME ZONE 'Europe/Berlin' AS DATE), 'MM')
....
WHERE CAST(FROM_TZ(CAST(BEGIN AS TIMESTAMP), 'UTC') AT TIME ZONE 'Europe/Berlin' AS DATE) = `{some Berlin time}`
是的,你需要调整你的查询就是这样。 –
不会毁了表现? – matthias
@matthias我认为它不会破坏性能提供使用旁边的'select'关键字,如在一个'游标调用',但如果你使用'where'条件和列'开始'有索引和你的解释计划使用这些索引时,很可能会对性能造成影响。 –