2016-04-22 75 views
0

對於大多數人來說,這可能是一個簡單的問題,但是我怎樣才能讓這個面具根據當天運行?Sysdate Oracle基於天運行

如果有人知道的Crystal Reports語法,我們有這個和它的作品{} PO_RECEIPTS.DATE_RECEIVED =的currentdate

然而,轉換成的Oracle SQL的時候,我怎麼能標準:TO_CHAR (SYSDATE,「MM- DD-YYYY HH24:MI:SS')成爲範圍,因此我們可以在白天選擇所有的東西,而不僅僅是與報告運行的第二個相匹配。

那麼像今天00:00:00到23:59:59之類的東西呢?

謝謝!

回答

3

如果PO_RECEIPTS.DATE_RECEIVED是所有的時間設置爲午夜日期列,那麼你可以這樣做:

WHERE PO_RECEIPTS.DATE_RECEIVED = TRUNC(sysdate) 

如果值有其他時間,那麼你可以使用範圍:

WHERE PO_RECEIPTS.DATE_RECEIVED >= TRUNC(sysdate) 
AND PO_RECEIPTS.DATE_RECEIVED < TRUNC(sysdate) + 1 

截斷日期會將時間設置爲默認時間,因此TRUNC(sysdate)是今天上午的午夜。對於範圍,您可以獲得等於或晚於今天午夜的所有記錄,並且不到明天午夜 - 這正是TRUNC(sysdate) + 1爲您提供的,使用的是正常的Oracle日期時間算法。

你真的不想把它轉換成一個字符串TO_CHAR();你要麼必須將所有的列值轉換爲字符串(這是低效的,並防止使用索引),或者讓字符串(隱式地)轉換回日期。最好將列值與相同的數據類型進行比較以減少或避免混淆。

+0

完美,謝謝! –

+0

另外,請注意並記住Alex DID不做的事情。比較TRUNC(DATE_RECEIVED)和TRUNC(SYSDATE)可能會更簡單(少打字)。但這不是好的做法。無論何時可以避免列函數內部函數的包裝,應該避免使用,即使代碼較長也是如此。這與性能(在DATE_RECEIVED列上使用索引的能力有關,因爲看起來這個字段在查詢中很重要)。 +1始終展示良好的編碼實踐。 – mathguy

+0

謝謝Mathguy,未來我會牢記這一點。我有很多東西需要了解編碼的正確習慣。 –