簡體   English   中英

將日期類型列與時間戳列進行比較

[英]Comparing date type column with a timestamp column

我有一張桌子,說三列的演示

create table demo(demo_id number,
                  created_date date,
                  mod_date systimestamp(6)
                 ); 

我的要求是返回一個包含兩列的 refcursor

1. Demo_id 
2. Status column 

這將導出如下:

if created_date = mod_date then "New" else "Updated" . 

所以我把我的代碼寫成:

select demo_id ,case when created_date=mod_date then "New" else "update" end from demo; 

但不知何故,即使日期相同,包括時間組件我的狀態值總是顯示更新。 我正在使用 SQL 開發人員運行我的查詢,並將 nls_date_format 修改為 DD/mm/yyyy hh24:mi:SS。 mod_date 也將存儲 systimestamp。

您正在將具有秒精度的日期與具有小數秒精度的時間戳進行比較。

如果created_date取自 sysdate 而mod_date取自 systimestamp ,那么您可以將2022-08-06 23:36:582022-08-06 23:36:58.373657進行比較。 那些不一樣。

數據類型比較和優先級規則意味着日期值被隱式轉換為時間戳,但這僅意味着它現在將2022-08-06 23:36:58.0000002022-08-06 23:36:58.373657進行比較。 那些仍然不一樣。

由於您無法為日期添加精度,因此您必須從時間戳中刪除精度,您可以通過將其轉換為該數據類型來做到這一點:

case when created_date = cast(mod_date as date) then 'New' else 'Updated' end as status

db<>小提琴

但是,如果該行在創建的同一秒內被修改 - 例如,從之前使用的示例中,如果mod_date設置為2022-08-06 23:36:58.999999 - 那么這不會被視為更新,因為一旦精度降低,原始和更新的mod_date是相同的,並且都與created_date相同。

這對您來說可能不是問題,但如果您也將created_date設置為時間戳,並使用systimestamp進行設置,它仍然會更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM