2017-11-11 166 views
0

处理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') ??

+0

是的,你需要调整你的查询就是这样。 –

+0

不会毁了表现? – matthias

+0

@matthias我认为它不会破坏性能提供使用旁边的'select'关键字,如在一个'游标调用',但如果你使用'where'条件和列'开始'有索引和你的解释计划使用这些索引时,很可能会对性能造成影响。 –

回答

0

你可以使用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}` 
相关问题