在 Oracle SQL Developer 上,我嘗試使用以下代碼作為基礎。但是,使用此代碼顯示了所有可能的資料,但我想過濾結果
WHERE oh.ship_by_date BETWEEN '01/01/2021' AND current date
(在系統日期顯示為 dd/mm/yyyy)
我嘗試放置此過濾器,但我不明白為什么所有按日期發貨的結果仍然出來,因此沒有過濾。我必須把過濾器放在哪里,我怎樣才能正確地撰寫它?非常感謝你的幫助。
select
q1.order_id, q1.status, q1.ship_by_date, q1.shipped_date,
count(q1.order_id) lines, sum(q1.qty_ordered) qty,
q1.user_def_num_4, q1.user_def_note_2, q1.name, q1.order_type, q1.seller_name,
sum(q1.qty_shipped),
q1.work_group, q1.creation_Date
from
(
SELECT
OH.ORDER_ID, OH.STATUS, TO_CHAR( OH.SHIP_BY_DATE, 'YYYY-MM-DD') ship_by_date,
TO_CHAR(OH.SHIPPED_DATE,'YYYY-MM-DD') shipped_date, ol.QTY_ORDERED,
oh.user_def_num_4, oh.user_def_note_2, oh.name, oh.order_type, ol.qty_shipped,
oh.seller_name, oh.creation_date, oh.work_group
FROM V_ORDER_HEADER Oh
left JOIN v_order_line ol on oh.order_id = ol.order_id
union all
(
SELECT
OH.ORDER_ID, OH.STATUS, TO_CHAR( OH.SHIP_BY_DATE, 'YYYY-MM-DD') ship_by_date,
TO_CHAR(OH.SHIPPED_DATE,'YYYY-MM-DD') shipped_date, ol.QTY_ORDERED,
oh.user_def_num_4, oh.user_def_note_2, oh.name, oh.order_type, ol.qty_shipped,
oh.seller_name, oh.creation_date, oh.work_group
FROM V_ORDER_HEADER_archive Oh
left JOIN v_order_line_archive ol on oh.order_id = ol.order_id
union
SELECT
OH.ORDER_ID, OH.STATUS, TO_CHAR( OH.SHIP_BY_DATE, 'YYYY-MM-DD') ship_by_date,
TO_CHAR(OH.SHIPPED_DATE,'YYYY-MM-DD') shipped_date, ol.QTY_ORDERED,
oh.user_def_num_4, oh.user_def_note_2, oh.name, oh.order_type, ol.qty_shipped,
oh.seller_name, oh.creation_date, oh.work_group
FROM V_ORDER_HEADER_archive_2 Oh
left JOIN v_order_line_archive ol on oh.order_id = ol.order_id
)
) q1
group by
q1.order_id, q1.status, q1.ship_by_date, q1.shipped_date,
q1.NAME, q1.order_type, q1.user_def_num_4, q1.user_def_note_2, q1.seller_name,
q1.work_group, q1.creation_Date
謝謝你。
uj5u.com熱心網友回復:
您可以將以下WHERE子句放在每個查詢部分,即在每個LEFT JOIN子句之后。
WHERE oh.ship_by_date >= DATE '2021-01-01' AND oh.ship_by_date < TRUNC(SYSDATE) 1
(順便說一下,這 1是縮寫 INTERVAL '1' DAY。)
另一種選擇是WHERE在合并所有表之后放置以下子句(即在) q1.
WHERE q1.ship_by_date >= DATE '2021-01-01' AND q1.ship_by_date < TRUNC(SYSDATE) 1
但這可能會慢得多,因為您首先要處理所有資料,而不僅僅是處理您感興趣的日期范圍,然后只有在最后才應用該日期范圍限制。因此,雖然這種替代方案可能被認為更具可讀性和更好的可維護性,但它可能仍然是一個壞主意。
然后,您在2021-01-01這里使用常量。明年運行查詢時,這仍然是相同的值嗎?如果您想要當前年份,則可以使用
WHERE oh.ship_by_date >= TRUNC(SYSDATE, 'YEAR') AND oh.ship_by_date < TRUNC(SYSDATE) 1
最后對您的資料發表評論:您在這里處理歷史表。更多的當前條目在V_ORDER_HEADER和 中V_ORDER_LINE。較舊的行已移至V_ORDER_HEADER_ARCHIVE,V_ORDER_HEADER_ARCHIVE_2和V_ORDER_LINE_ARCHIVE。從名稱上看,所有這些都是視圖,而不是表,所以我不知道這里的幕后發生了什么神奇。通常,使用磁區表通常是一個更好的主意,因此您只使用一個表,而不是使用當前表和查詢中的歷史表,然后 DBMS 訪問它需要完成任務的磁區,這通常是只訪問當前磁區,而很少訪問舊磁區。只需洗掉舊磁區,就可以更快地洗掉舊資料。
uj5u.com熱心網友回復:
有兩種方法可以立即想到。在這兩種情況下,我都建議嘗試將您的 ship_by_date 轉換為日期時間,然后與您的(硬編碼?)2021 日期和當前日期進行比較。
例如:
WHERE CAST(oh.ship_by_date AS datetime)
BETWEEN '2021-01-01 00:00:00.000' AND GETDATE()
或者
WHERE CAST(oh.ship_by_date AS datetime) > '2021-01-01 00:00:00.000'
and CAST(oh.ship_by_date AS datetime) < GETDATE()
編輯 - 我剛剛意識到您也在選擇中使用 TO_CHAR 將您的 oh.ship_by_date 轉換為 CHAR。也試著把那部分去掉。例如
select q1.order_id, q1.status , q1.ship_by_date, q1.shipped_date,
count(q1.order_id) lines, sum(q1.qty_ordered) qty, q1.user_def_num_4, q1.user_def_note_2, q1.name, q1.order_type, q1.seller_name, sum(q1.qty_shipped), q1.work_group, q1.creation_Date
from
(SELECT OH.ORDER_ID, OH.STATUS, OH.SHIP_BY_DATE, TO_CHAR(OH.SHIPPED_DATE,'YYYY-MM-DD') shipped_date, ol.QTY_ORDERED,
oh.user_def_num_4, oh.user_def_note_2, oh.name, oh.order_type, ol.qty_shipped, oh.seller_name, oh.creation_date, oh.work_group
FROM V_ORDER_HEADER Oh
left JOIN v_order_line ol on oh.order_id = ol.order_id
--where oh.order_id = '0082693218') */
union all
(SELECT OH.ORDER_ID, OH.STATUS, OH.SHIP_BY_DATE, TO_CHAR(OH.SHIPPED_DATE,'YYYY-MM-DD') shipped_date, ol.QTY_ORDERED,
oh.user_def_num_4, oh.user_def_note_2, oh.name, oh.order_type, ol.qty_shipped, oh.seller_name, oh.creation_date, oh.work_group
FROM V_ORDER_HEADER_archive Oh
left JOIN v_order_line_archive ol on oh.order_id = ol.order_id
union
SELECT OH.ORDER_ID, OH.STATUS, OH.SHIP_BY_DATE, TO_CHAR(OH.SHIPPED_DATE,'YYYY-MM-DD') shipped_date, ol.QTY_ORDERED,
oh.user_def_num_4, oh.user_def_note_2, oh.name, oh.order_type, ol.qty_shipped, oh.seller_name, oh.creation_date, oh.work_group
FROM V_ORDER_HEADER_archive_2 Oh
left JOIN v_order_line_archive ol on oh.order_id = ol.order_id))
--where oh.order_id = '0082693218') */
q1
WHERE CAST(oh.ship_by_date AS datetime)
BETWEEN '2021-01-01 00:00:00.000' AND GETDATE()
group by q1.order_id, q1.status, q1.ship_by_date, q1.shipped_date,
q1.NAME, q1.order_type, q1.user_def_num_4, q1.user_def_note_2, q1.seller_name, q1.work_group, q1.creation_Date
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361927.html
上一篇:向多個接收者發送電子郵件程式
下一篇:從表中洗掉元素的洗掉函式
