我正在嘗試使用 TRUNC 函式從時間戳欄位中截斷毫秒。在我的表中,時間戳是這樣的:
2022-06-01-14:22:37.965000
我想擺脫毫秒。
我正在嘗試的是這個查詢:
SELECT * FROM SCHEMA.TABLE1 PT INNER JOIN SCHEMA.TABLE2 ST
ON (ST.PROPERTY1 = PT.PROPERTY1 AND
ST.PROPERTY2 = PT.PROPERTY2 AND
ST.PROPERTY3 = PT.PROPERTY3 AND
ST.PROPERTY4 = PT.PROPERTY4 AND
ST.PROPERTY5 = PT.PROPERTY5 AND
ST.PROPERTY6 = PT.PROPERTY6 AND
ST.PROPERTY7 = PT.PROPERTY7 AND
ST.PROPERTY8 = PT.PROPERTY8)
WHERE ST.ID = 4 AND TRUNC(TO_DATE(ST.TIMESTAMP), SECOND) = '2022-06-01-14:22:37'
我究竟做錯了什么?
uj5u.com熱心網友回復:
如果你想四舍五入TIMESTAMP到最接近的秒然后使用:
CAST(ts AS TIMESTAMP(0))
如果要將 截斷TIMESTAMP到當前秒的開頭,請使用:
CAST(
TRUNC(ts, 'MI') INTERVAL '1' SECOND * TRUNC(EXTRACT(SECOND FROM ts))
AS TIMESTAMP(0)
)
或將其轉換為日期,然后回傳時間戳:
CAST(CAST(ts AS DATE) AS TIMESTAMP(0))
(無論你想要什么精度)
例如:
SELECT ts,
CAST(ts AS TIMESTAMP(0)) AS ts_rounded,
CAST(
TRUNC(ts, 'MI') INTERVAL '1' SECOND * TRUNC(EXTRACT(SECOND FROM ts))
AS TIMESTAMP(0)
) AS ts_trunc
FROM (
SELECT TIMESTAMP '2022-06-01 14:22:37.965000' AS ts
FROM DUAL
)
輸出:
TS TS_ROUNDED TS_TRUNC 2022-06-01 14:22:37.965000000 2022-06-01 14:22:38。 2022-06-01 14:22:37。
db<>在這里擺弄
但是,使用范圍可能更簡單:
SELECT *
FROM SCHEMA.TABLE1 PT
INNER JOIN SCHEMA.TABLE2 ST
ON (ST.PROPERTY1 = PT.PROPERTY1 AND
ST.PROPERTY2 = PT.PROPERTY2 AND
ST.PROPERTY3 = PT.PROPERTY3 AND
ST.PROPERTY4 = PT.PROPERTY4 AND
ST.PROPERTY5 = PT.PROPERTY5 AND
ST.PROPERTY6 = PT.PROPERTY6 AND
ST.PROPERTY7 = PT.PROPERTY7 AND
ST.PROPERTY8 = PT.PROPERTY8)
WHERE ST.ID = 4
AND st.timestamp >= TIMESTAMP '2022-06-01 14:22:37'
AND st.timestamp < TIMESTAMP '2022-06-01 14:22:37' INTERVAL '1' SECOND;
st.timestamp(這將在列上使用索引)
或者將值轉換為字串:
SELECT *
FROM SCHEMA.TABLE1 PT
INNER JOIN SCHEMA.TABLE2 ST
ON (ST.PROPERTY1 = PT.PROPERTY1 AND
ST.PROPERTY2 = PT.PROPERTY2 AND
ST.PROPERTY3 = PT.PROPERTY3 AND
ST.PROPERTY4 = PT.PROPERTY4 AND
ST.PROPERTY5 = PT.PROPERTY5 AND
ST.PROPERTY6 = PT.PROPERTY6 AND
ST.PROPERTY7 = PT.PROPERTY7 AND
ST.PROPERTY8 = PT.PROPERTY8)
WHERE ST.ID = 4
AND TO_CHAR(st.timestamp, 'YYYY-MM-DD HH24:MI:SS') = '2022-06-01 14:22:37';
(這不會使用索引st.timestamp,而是需要一個單獨的基于函式的索引TO_CHAR(st.timestamp, 'YYYY-MM-DD HH24:MI:SS')。)
uj5u.com熱心網友回復:
我只會使用適當格式的 TO_CHAR 來獲得您想要的結果:
WHERE TO_CHAR(ST.TIMESTAMP, 'YYYY-MM-DD-HH24:MI:SS') = '2022-06-01-14:22:37'
uj5u.com熱心網友回復:
另一種截斷到第二精度的方法是轉換為日期:
select cast(timestamp '2022-06-01 14:22:37.965' as date) from dual
2022-06-01 14:22:37
然后要么將其與另一個日期進行比較,要么將其轉換回時間戳以與另一個時間戳進行比較。(無論哪種方式,不要與字串進行比較 - 僅當您將時間戳值也轉換為字串時,以相同的格式顯式地這樣做。并且不要to_date()在日期或時間戳值上使用 - 您依賴隱式轉換和您的 NLS 設定。)
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/484722.html
上一篇:資料集中不同階段的時間差
