第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使oracle的last_day函數(shù)在oracle和h2之間兼容

使oracle的last_day函數(shù)在oracle和h2之間兼容

寶慕林4294392 2023-07-13 14:38:32
我在java項目中有一個sql查詢。它必須在 oracle 和 h2 中執(zhí)行,具體取決于客戶端及其 DBMS 選擇。它必須返回值,其中 sent_date 是月份減一(上個月注冊表)SELECT?*?FROM?TABLE?WHERE?SENT_DATE?BETWEEN?ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1)? AND?LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1))?ORDER?BY?ELAPSED_TIME?DESC問題是,LAST_DAY 函數(shù)是 Oracle 特定函數(shù),H2 中不存在,并且 H2 日期管理有時在 Oracle 中不起作用,但我需要它完全兼容。我們怎樣才能做到這一點?
查看完整描述

2 回答

?
小唯快跑啊

TA貢獻1863條經(jīng)驗 獲得超2個贊

它可能會更高興:


SELECT * FROM TABLE

WHERE SENT_DATE BETWEEN ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1) AND TRUNC(SYSDATE,'mm') - 1

ORDER BY ELAPSED_TIME DESC

表明它們評估為相同的值:


SELECT ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1) as orig_start,

  LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1)) as orig_end,

  TRUNC(SYSDATE,'mm') - 1 as new_end

FROM dual;


ORIG_START          ORIG_END            NEW_END            

------------------- ------------------- -------------------

2019-08-01 00:00:00 2019-08-31 00:00:00 2019-08-31 00:00:00

但請記住,這between是包容性的,因此,如果您sent_date有非午夜時間,則會排除 2019-08-31 00:00:01 到 2019-08-31 23:59:59 之間的任何內(nèi)容。


這樣做更安全:


SELECT * FROM TABLE

WHERE SENT_DATE >= ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1)

AND SENT_DATE < TRUNC(SYSDATE,'mm')

ORDER BY ELAPSED_TIME DESC

其中將包括 2019-08-01 00:00:00 或之后的所有內(nèi)容,以及直到(但不包括)2019-09-01 00:00:00 的所有內(nèi)容 - 這樣就不會出現(xiàn)缺失的一天。


或者,如果它不能識別,add_months也許:


SELECT * FROM TABLE

WHERE SENT_DATE >= TRUNC(SYSDATE,'mm') - INTERVAL '1' MONTH

AND SENT_DATE < TRUNC(SYSDATE,'mm')

ORDER BY ELAPSED_TIME DESC

(我無法測試其中任何一個是否在 H2 中實際工作...... *8-)


查看完整回答
反對 回復 2023-07-13
?
慕妹3146593

TA貢獻1820條經(jīng)驗 獲得超9個贊

LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1))

可以簡化為


TRUNC(SYSDATE,'mm') - 1

沒有LAST_DAY功能,但 H2 也不支持帶有 'mm' 參數(shù)的非標準TRUNC。


所以你也需要避免它。這樣的查詢將與兩個數(shù)據(jù)庫兼容(但是,您需要最新版本的 H2,例如 1.4.199):


SELECT * FROM tableName WHERE SENT_DATE BETWEEN

    CURRENT_DATE - (EXTRACT(DAY FROM CURRENT_DATE) - 1) - INTERVAL '1' MONTH

AND

    CURRENT_DATE - EXTRACT(DAY FROM CURRENT_DATE)

ORDER BY ELAPSED_TIME DESC

請注意,這個查詢不是標準的,我故意使用Oracle風格的日期算法來簡化查詢,它是H2支持的。ADD_MONTH如果您愿意,也可以在此處使用非標準。


如果您只需要使用標準語法來兼容更多數(shù)據(jù)庫,則可以避免使用 Oracle/H2 風格的算術:


SELECT * FROM tableName WHERE SENT_DATE BETWEEN

    CURRENT_DATE - (EXTRACT(DAY FROM CURRENT_DATE) - 1) * INTERVAL '1' DAY - INTERVAL '1' MONTH

AND

    CURRENT_DATE - EXTRACT(DAY FROM CURRENT_DATE) * INTERVAL '1' DAY

ORDER BY ELAPSED_TIME DESC

另請注意,Oracle與其他數(shù)據(jù)庫不同,沒有正常的DATE數(shù)據(jù)類型,其DATE類型可能有時間(H2可以在Oracle兼容模式下模擬這種偏差)。因此,只有當您確保日期都在 時,所有這些帶有“BETWEEN”的查詢(包括最初的僅 Oracle 查詢)才能正常工作00:00:00。如果您的日期還包含時間部分,您需要使用幾個比較運算符:


SELECT * FROM tableName WHERE SENT_DATE >=

    CURRENT_DATE - (EXTRACT(DAY FROM CURRENT_DATE) - 1) - INTERVAL '1' MONTH

AND SENT_DATE <

    CURRENT_DATE - (EXTRACT(DAY FROM CURRENT_DATE) - 1)

ORDER BY ELAPSED_TIME DESC

(這里也使用了 Oracle/H2 算法,其他數(shù)據(jù)庫的乘法可能INTERVAL '1' DAY是必要的。)


查看完整回答
反對 回復 2023-07-13
  • 2 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號