我正在運行以下查詢以獲取過去 24 小時內記錄的資料。我需要從午夜(DATE > 12:00 AM)開始記錄的相同資料以及從月初開始記錄的資料。不確定使用 between 是否有效,或者是否有更好的選擇。有什么建議。
SELECT COUNT(NUM)
FROM TABLE
WHERE
STATUS = 'CNLD'
AND
TRUNC(TO_DATE('1970-01-01','YYYY-MM-DD') OPEN_DATE/86400) = trunc(sysdate)
輸出(只需要計數)。OPEN_DATE 資料型別為 NUMBER。下面的輸出顯示過去 24 小時內的計數。我需要從午夜開始計數,從月初開始計數。

uj5u.com熱心網友回復:
您顯示的查詢將獲取OPEN_DATE表示今天早上午夜之后時間的“紀元日期”數字的行數*。條件:
TRUNC(TO_DATE('1970-01-01','YYYY-MM-DD') OPEN_DATE/86400) = trunc(sysdate)
需要OPEN_DATE將表中的每個值(或至少 CNLD 行的所有值)從數字轉換為實際日期,這將做比必要更多的作業,并且會停止針對該列的標準索參考過的。它可以重寫為:
OPEN_DATE >= (trunc(sysdate) - date '1970-01-01') * 86400
它將今天早上的午夜轉換為其時代等值,一次,并將所有數字與該值進行比較;如果有索引并且優化器認為它是合適的,則使用索引。
要獲取自月初以來的所有內容,您只需更改 的默認行為trunc(),即截斷到“DD”元素,改為截斷到月初:
OPEN_DATE >= (trunc(sysdate, 'MM') - date '1970-01-01') * 86400
在過去的 24 小時內,從當前時間中減去一天而不是截斷它:
OPEN_DATE >= ((sysdate - 1) - date '1970-01-01') * 86400
db<>擺弄一些虛構的資料,以得到今天的 72 個,過去 24 小時的更多,整個月的更多。
根據您當前的查詢,我假設不會有任何未來日期的值,因此您無需擔心其中任何一個的上限。
*忽略閏秒...
uj5u.com熱心網友回復:
聽起來您有一個資料型別為 TIMESTAMP 的列,而您只想選擇 TIMESTAMP 指示它是今天日期的行?作為一個相關問題,您想根據一些系統值(如 CURRENT TIMESTAMP 和 CURRENT DATE)找到當前月份的那些?如果是這樣,讓我們??將您的列稱為 TRANSACTION_TIMESTAMP 而不是(保留字)DATE。您的第一個查詢可能是:
SELECT COUNT(NUM)
FROM TABLE
WHERE
STATUS = 'CLND'
AND
DATE(TRANSACTION_TIMESTAMP)=CURRENT DATE
查找當前月份到今天為止的所有內容的第二個示例可能是:
SELECT COUNT(NUM)
FROM TABLE
WHERE
STATUS = 'CLND'
AND
YEAR(DATE(TRANSACTION_TIMESTAMP)=YEAR(CURRENT DATE) AND
MONTH(DATE(TRANSACTION_TIMESTAMP)=MONTH(CURRENT DATE) AND
DAY(DATE(TRANSACTION_TIMESTAMP)<=DAY(CURRENT DATE)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414342.html
標籤:
