日期和今天之间



在Oracle SQL Developer上,我尝试使用下面的代码作为基础。然而,有了这个代码,所有可能的数据都显示出来了,但我想过滤的结果

WHERE oh.ship_by_date BETWEEN '01/01/2021' AND current date

(在系统中,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

谢谢。

您可以将以下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_HEADERV_ORDER_LINE中有更多的当前条目。较旧的行已移动到V_ORDER_HEADER_ARCHIVEV_ORDER_HEADER_ARCHIVE_2V_ORDER_LINE_ARCHIVE。从名字上看,所有这些都是视图,而不是表格,所以我不知道幕后发生了什么魔法。一般来说,使用分区表通常是一个更好的主意,因此在查询中只使用一个表,而不是当前表和历史表,然后DBMS访问完成任务所需的分区,通常只访问当前分区,而很少访问旧分区。而且,只需删除旧分区,就可以更快地删除旧数据。

有两种方法会立刻浮现在脑海中。在这两种情况下,我都建议尝试将您的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

最新更新