Oracle
Oracle:將時間戳轉換為日期並比較結果
我真的不明白
cast(timestamp as date)
在做什麼。我使用的是 Oracle Database 11g Express Edition Release 11.2.0.2.0。select cast(to_timestamp('20190516 08:00:00', 'yyyymmdd HH24:MI:SS') as date) from dual
以我在會話中使用的日期格式顯示日期 20190516(不含時間)。
select to_timestamp('20190516 08:00:00', 'yyyymmdd HH24:MI:SS') from dual;
以我的會話格式顯示日期和時間。到目前為止一切都如我所料。
所以鑄造似乎刪除了時間部分。現在我想將轉換結果與適用於 SQL Server 但不適用於 Oracle 的日期進行比較。
select case when cast(to_timestamp('20190516 08:00:00', 'yyyymmdd HH24:MI:SS') as date) = to_date('20190516', 'yyyymmdd') then 1 else 0 end as match from dual; -- 0 = not matched select case when trunc(to_timestamp('20190516 08:00:00', 'yyyymmdd HH24:MI:SS')) = to_date('20190516', 'yyyymmdd') then 1 else 0 end as match from dual; -- 1 = matched
cast(to_timestamp('20190516 08:00:00', 'yyyymmdd HH24:MI:SS') as date)
當它似乎不僅僅是第一個選擇所指示的日期時,返回的確切值是什麼?為什麼我不能比較結果?如圖所示,我很幸運有另一個解決方案
trunc()
。我想知道為什麼比較不起作用以及是否有可能進行比較cast
。我正在將視圖從 SQL Server 移植到 Oracle,並希望盡可能保持相同,並且cast
在 SQL Server 中完成。
DATE
從 a 轉換為數據類型只會TIMESTAMP
刪除小數秒,因此您的直接to_date('20190516', 'yyyymmdd')
比較確實會失敗。這只是一個讓您感到困惑的顯示問題。Oracle
DATE
數據類型的定義(來自此處):有效日期範圍從公元前 4712 年 1 月 1 日到公元 9999 年 12 月 31 日。預設格式由 NLS_DATE_FORMAT 參數顯式確定或由 NLS_TERRITORY 參數隱式確定。大小固定為 7 個字節。此數據類型包含日期時間欄位 YEAR、MONTH、DAY、HOUR、MINUTE 和 SECOND。它沒有小數秒或時區。
這些查詢可能表現得最好:
-- cast to date, and format with TO_CHAR to show that the time element still exists select TO_CHAR( cast(to_timestamp('20190516 08:00:00', 'yyyymmdd HH24:MI:SS') as date) ,'yyyymmdd HH24:MI:SS') from dual; -- demonstrate that the fractional element gets removed select cast( cast(to_timestamp('20190516 08:00:00.123', 'yyyymmdd HH24:MI:SS.FF') as date) as timestamp) from dual;