[英]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
systimestamp
和current_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_timestamp
或systimestamp
,將其向后調整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.