簡體   English   中英

如何在Oracle SQL上比較轉換為UTC的當前時間戳和轉換為UTC的另一個時間戳?

[英]How do I compare the current timestamp converted to UTC to another timestamp converted to UTC on Oracle SQL?

我試圖從距特定時間30分鍾或更短的Oracle SQL表中提取行。 但是,時間未存儲為日期字段,而是以“ 2019-04-04T21:32:38 + 0000”格式存儲在VARCHAR2字段中

有沒有辦法在SQL查詢中執行此操作?

嘗試花費時間並將其轉換,但我只能獲得時間戳,而且我不知道如何正確地偏移時間

您需要做的第一件事是將字符串轉換為日期時間類型。 由於您的字符串具有時區值,因此會將其轉換為TIMESTAMP WITH TIME ZONE數據類型。

to_timestamp_tz( '2019-04-04T21:32:38+0000', 'yyyy-mm-dd"T"hh24:mi:sstzhtzm')

這給了我“ 04-APR-19 09.32.38.000000000 PM GMT”,它是日期/時間值,而不是字符值。

您說您正在將其與其他一些值進行比較,但是沒有提供任何詳細信息,因此我真的無法再進一步了。

另外,請盡量不要將日期/時間存儲為varchar2s 只會造成問題。

您無需轉換為UTC。 如@eaolson所示,您可以將您需要的字符串轉換為帶有時區值的時間戳。 然后,您可以將其與具有時區值的任何其他時間戳直接進行比較-Oracle將無形地處理任何調整。 您當然可以轉換為UTC,但不必這樣做。

我不確定如何將當前時間轉換為TZ

systimestampcurrent_timestamp都已經具有時區信息。

因此,為了展示一些查詢的一致性,請結合使用:

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF1 TZR';

select current_timestamp, current_timestamp at time zone 'GMT' as now_as_gmt
from dual;

CURRENT_TIMESTAMP                   NOW_AS_GMT               
----------------------------------- -------------------------
2019-04-15 16:02:29.6 EUROPE/LONDON 2019-04-15 15:02:29.6 GMT

並在截止30分鍾之前和之后使用CTE生成一些數據:

-- CTE for sample data
with your_table (some_time) as (
  select '2019-04-04T21:32:38+0000' from dual
  union all
  select to_char(current_timestamp at time zone 'Africa/Nairobi'
    - interval '30' minute, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') from dual
  union all
  select to_char(current_timestamp at time zone 'Europe/London'
    - interval '29' minute, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') from dual
  union all
  select to_char(current_timestamp at time zone 'America/New_York'
    - interval '28' minute, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') from dual
  union all
  select to_char(current_timestamp at time zone 'UTC'
    - interval '27' minute, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') from dual
)
-- query
select some_time,
  to_timestamp_tz(some_time, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') some_time_as_tstz,
  to_timestamp_tz(some_time, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') at time zone 'GMT' some_time_as_gmt
from your_table;

SOME_TIME                SOME_TIME_AS_TSTZ            SOME_TIME_AS_GMT         
------------------------ ---------------------------- -------------------------
2019-04-04T21:32:38+0000 2019-04-04 21:32:38.0 GMT    2019-04-04 21:32:38.0 GMT
2019-04-15T17:32:29+0300 2019-04-15 17:32:29.0 +03:00 2019-04-15 14:32:29.0 GMT
2019-04-15T15:33:29+0100 2019-04-15 15:33:29.0 +01:00 2019-04-15 14:33:29.0 GMT
2019-04-15T10:34:29-0400 2019-04-15 10:34:29.0 -04:00 2019-04-15 14:34:29.0 GMT
2019-04-15T14:35:29+0000 2019-04-15 14:35:29.0 GMT    2019-04-15 14:35:29.0 GMT

您可以看到轉換為時間戳的字符串的實際值及其等效的GMT-再次不需要,僅用於視覺驗證。

然后,您可以在過濾器中使用current_timestampsystimestamp ,將其向后調整30分鍾:

-- same CTE omitted
select some_time,
  to_timestamp_tz(some_time, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') some_time_as_tstz,
  to_timestamp_tz(some_time, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM') at time zone 'GMT' some_time_as_gmt
from your_table
where to_timestamp_tz(some_time, 'YYYY-MM-DD"T"HH24:MI:SSTZHTZM')
  > current_timestamp - interval '30' minute;

SOME_TIME                SOME_TIME_AS_TSTZ            SOME_TIME_AS_GMT         
------------------------ ---------------------------- -------------------------
2019-04-15T15:33:29+0100 2019-04-15 15:33:29.0 +01:00 2019-04-15 14:33:29.0 GMT
2019-04-15T10:34:29-0400 2019-04-15 10:34:29.0 -04:00 2019-04-15 14:34:29.0 GMT
2019-04-15T14:35:29+0000 2019-04-15 14:35:29.0 GMT    2019-04-15 14:35:29.0 GMT

排除了過去30分鍾或更長時間的兩個CTE行。 它們的實際時區或您的會話/系統的時區在比較中很受重視,而不必將任何內容顯式轉換為任何特定的時區。

當它們比當前時間戳提前30分鍾或

然后根據時間范圍檢查您的值:

where initial_proc_etr >= current_timestamp - interval '30' minute;
and initial_proc_etr < current_timestamp + interval '30' minute

如您在評論中所述,假設該列具有時區成分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM