我有一個用例,我想按時間訂購,但要按特定解析度訂購。例如,我的架構將時間戳保存為 9 位小數(納秒精度),但我只想按分鐘排序并使用不同的欄位在該分鐘內排序。我試過這個
select * from myTable order by (cast(myTimeStamp at time zone 'UTC' as timestamp) - to_timestamp('01-JAN-01'))/1000000000*60 desc, id desc;
將時間戳轉換為紀元,然后除以獲得分鐘精度。但這給出了錯誤的順序。此外,當我對上述命令進行轉儲以了解回傳的資料型別時,我看到資料型別:typ=190 并且我在 oracle 檔案中找不到該型別,這增加了我的困惑。
所以我想知道我錯過了什么?應該可以通過截斷的(到分鐘)時間戳進行排序,任何幫助表示贊賞。
uj5u.com熱心網友回復:
轉換TIMESTAMP WITH TIME ZONE的UTC時區,這樣就可以比較相同的時間,然后TRUNC吃掉它回到分鐘開始:
SELECT *
FROM myTable
ORDER BY
TRUNC(myTimeStamp at time zone 'UTC', 'MI') DESC,
id DESC;
其中,對于樣本資料:
CREATE TABLE myTable(
id NUMBER,
myTimestamp TIMESTAMP WITH TIME ZONE
);
INSERT INTO myTable(id, myTimestamp)
SELECT 1, TIMESTAMP '1970-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '1970-01-01 00:00:00 America/New_York' FROM DUAL UNION ALL
SELECT 3, TIMESTAMP '1970-01-01 00:00:00 Asia/Hong_Kong' FROM DUAL UNION ALL
SELECT 4, TIMESTAMP '1970-01-01 00:00:00 Europe/Paris' FROM DUAL UNION ALL
SELECT 5, TIMESTAMP '1970-01-01 01:00:00 UTC' FROM DUAL UNION ALL
SELECT 6, TIMESTAMP '1970-01-01 01:00:00 America/New_York' FROM DUAL UNION ALL
SELECT 7, TIMESTAMP '1970-01-01 01:00:00 Europe/Berlin' FROM DUAL;
輸出:
ID 我的時間戳 6 01-JAN-70 01.00.00.000000 美洲/紐約 2 01-JAN-70 00.00.00.000000 美洲/紐約 5 01-JAN-70 01.00.00.000000 UTC 7 01-JAN-70 01.00.00.000000 歐洲/柏林 1 01-JAN-70 00.00.00.000000 UTC 4 01-JAN-70 00.00.00.000000 歐洲/巴黎 3 01-JAN-70 00.00.00.000000 亞洲/香港
如果您想查看在排序程序中使用的轉換為 UTC 的值,則只需將其添加到輸出中:
SELECT t.*,
TO_CHAR(TRUNC(myTimeStamp at time zone 'UTC', 'MI'), 'YYYY-MM-DD HH24:MI:SS')
AS converted_ts
FROM myTable t
ORDER BY
TRUNC(myTimeStamp at time zone 'UTC', 'MI') DESC,
id DESC;
哪些輸出:
ID 我的時間戳 CONVERTED_TS 6 01-JAN-70 01.00.00.000000 美洲/紐約 1970-01-01 06:00:00 2 01-JAN-70 00.00.00.000000 美洲/紐約 1970-01-01 05:00:00 5 01-JAN-70 01.00.00.000000 UTC 1970-01-01 01:00:00 7 01-JAN-70 01.00.00.000000 歐洲/柏林 1970-01-01 00:00:00 1 01-JAN-70 00.00.00.000000 UTC 1970-01-01 00:00:00 4 01-JAN-70 00.00.00.000000 歐洲/巴黎 1969-12-31 23:00:00 3 01-JAN-70 00.00.00.000000 亞洲/香港 1969-12-31 16:00:00
如果您只是使用TRUNC而不轉換為公共時區,那么它將根據日期和時間組件進行排序,而不考慮時區的相對差異。
db<>在這里擺弄
uj5u.com熱心網友回復:
為什么不將時間戳截斷為分鐘?
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:Mi:ss';
Session altered.
SQL> select systimestamp col_1,
2 trunc(systimestamp, 'mi') col_2
3 from dual;
COL_1 COL_2
---------------------------------------- -------------------
29.12.21 20:32:50,178000 01:00 29.12.2021 20:32:00
SQL>
那你就
order by trunc(timestamp_column, 'mi'),
yet_another_column
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/397705.html
上一篇:拆分全名列
下一篇:一張表的簡單SQL查詢
