Oracle

Oracle:將時間戳轉換為日期並比較結果

  • May 17, 2019

我真的不明白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')比較確實會失敗。這只是一個讓您感到困惑的顯示問題。

OracleDATE數據類型的定義(來自此處):

有效日期範圍從公元前 4712 年 1 月 1 日到公元 9999 年 12 月 31 日。預設格式由 NLS_DATE_FORMAT 參數顯式確定或由 NLS_TERRITORY 參數隱式確定。大小固定為 7 個字節。此數據類型包含日期時間欄位 YEAR、MONTH、DAY、HOUR、MINUTE 和 SECOND。它沒有小數秒或時區。

這個 DB Fiddle 展示了.

這些查詢可能表現得最好:

-- 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;

引用自:https://dba.stackexchange.com/questions/238322