簡體   English   中英

在SQL中比較兩個日期時oracle的准確性

[英]The accuracy of oracle when compare two date in SQL

它是按順序運行的兩個過程。 在步驟一中,系統時間的運行時間戳為2019/5/30 12:02:58.100 sql如下

insert into A(xxx,xxx,cdate) values(xxx,xxx,sysdate)

而且我發現此插入行的cdate字段是2019/5/30 12:02:58 ,沒有毫秒。

然后程序兩次運行,系統時間的運行時間戳為2019/5/30 12:02:58.200 SQL如下

select xxx from A where cdate<sysdate

這將不返回任何結果。 這很奇怪,因為我剛剛在cdate 2019/5/30 12:02:58插入了一行。 這應該小於sysdate

  1. 當Oracle存儲日期值(例如2019/5/30 12:02:58 ,它會丟掉毫秒還是僅將其存儲在后台而不顯示它?

  2. 比較cdate<sysdate ,它使用哪個兩個值? 我猜它正在使用2019/5/30 12:02:58 < 2019/5/30 12:02:58 ,所以這返回false。

當Oracle存儲日期值(例如2019/5/30 12:02:58 ,它會丟掉毫秒還是僅將其存儲在后台而不顯示它?

日期值沒有可丟棄的毫秒部分。 sysdate返回DATE 數據類型

此數據類型包含日期時間字段YEAR,MONTH,DAY,HOUR,MINUTE和SECOND。 它沒有小數秒或時區。

在您的過程中,您正在查看TIMESTAMP值:

此數據類型包含日期時間字段YEAR,MONTH,DAY,HOUR,MINUTE和SECOND。 它包含小數秒,但沒有時區。

...或具有時區的變體,例如systimestamp返回的TIMESTAMP WITH TIME ZONE:

此數據類型包含日期時間字段YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,TIMEZONE_HOUR和TIMEZONE_MINUTE。 它具有小數秒和明確的時區。


比較cdate<sysdate ,它使用哪個兩個值? 我猜它正在使用2019/5/30 12:02:58 < 2019/5/30 12:02:58 ,所以這返回false。

當您的insert語句使用sysdate ,此時cdate是否定義為DATE或TIMESTAMP並不重要,如果后者,則小數秒部分僅被截斷為零。 sysdate還返回一個DATE,所以可以,它要么在做:

2019-05-30 12:02:58 < 2019-05-30 12:02:58

要么

2019-05-30 12:02:58.000 < 2019-05-30 12:02:58

這可能涉及隱式強制轉換。 無論哪種方式,結果的確是錯誤的。


如果要比較可能在同一秒內的值,則必須使用TIMESTAMP。 適當地將列定義為TIMESTAMP變體之一,然后將systimestamp而不是sysdate用於插入和比較。 所有這些都必須是時間戳記-如果您所做的任何部分都保留為日期,那么在某些時候,小數秒將丟失,您將處於現在的位置。

如果您的列是DATE類型,則它不存儲毫秒。 SYSDATE也不會返回它們。 確保您的列是TIMESTAMP,並具有合適的分數精度數字以存儲所需的毫秒數,並確保將其與SYSTIMESTAMP進行比較

暫無
暫無

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

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