需要PL / SQL脚本的想法

时间:2014-04-02 08:10:34

标签: sql date

我从一组表中提取数据,这些表需要一个以数据为列的where子句。 我的团队在每次运行查询时手动输入日期都会出错。我想编写一个PL SQL来从数据库(oracle)动态获取日期字段。 以下是查询。

select oli.cart_key,lext.minor_order_number,wlkp.mf_wh_loc_id,oli.warehouse_type from tab1 oli,tab2 lext,tab3 wlkp where 
oli.cart_line_key = lext.cart_line_key and
oli.warehouse_code = wlkp.warehouse_code and
oli.warehouse_type = 'DC' and
lext.fulfillment_partner_key = 106 and
lext.order_status_secondary = 2000 and
lext.date_sent_to_fp is not null and
to_char(lext.date_sent_to_fp ,'DD-MON-YYYY HH24:MI:SS') >= ('01-APR-2014 03:00:00') and 
oli.active_flag = 'Y' and wlkp.active_flag = 'Y'
order by wlkp.mf_wh_loc_id

日期字段' 01-APR-2014 03:00:00'是我想从双表中得到的东西。是否可以这样做?

请告诉我。

此致 阿伦

2 个答案:

答案 0 :(得分:1)

请将日期作为日期类型进行比较。你不希望根据字母表(DEC< NOV)进行比较。它不仅非常简单,而且还可以在每条记录中保存对to_char函数的调用(1毫秒记录,1毫秒调用!!)。

select oli.cart_key,
       lext.minor_order_number,
       wlkp.mf_wh_loc_id,
       oli.warehouse_type 
  from tab1 oli,
  join tab2 lext on oli.cart_line_key = lext.cart_line_key 
  join tab3 wlkp ON oli.warehouse_code = wlkp.warehouse_code 
 where oli.warehouse_type = 'DC' 
   and lext.fulfillment_partner_key = 106 
   and lext.order_status_secondary = 2000 
   and lext.date_sent_to_fp is not null 
   and lext.date_sent_to_fp >= Trunc(SYSDATE) +3/24
   and oli.active_flag = 'Y' 
   and wlkp.active_flag = 'Y'
order by wlkp.mf_wh_loc_id

更新:如果您在4月1日凌晨3点运行查询,并且您的数据库位于同一时区,则无需执行任何操作。 Sysdate将在凌晨3点接受该日期的谷歌。

但是如果您想将值更改为今天的3.AM,只需将“SYSDATE”更改为“Trunc(SYSDATE)+3/24”,从新时间戳中删除时间信息并添加3小时。

注意:

  1. 我更改了您的查询以使用JOIN SYNTAX。它更清晰 有时它会提高性能。
  2. 您不需要双表。你已经有了一张表来制作 选择。

答案 1 :(得分:0)

如果您想获得当前日期,可以使用SYSDATE

select oli.cart_key,lext.minor_order_number,wlkp.mf_wh_loc_id,oli.warehouse_type from 
tab1 oli,tab2 lext,tab3 wlkp 
where 
oli.cart_line_key = lext.cart_line_key and
oli.warehouse_code = wlkp.warehouse_code and
oli.warehouse_type = 'DC' and
lext.fulfillment_partner_key = 106 and
lext.order_status_secondary = 2000 and
lext.date_sent_to_fp is not null and
to_char(lext.date_sent_to_fp ,'DD-MON-YYYY HH24:MI:SS') >= 
(SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') FROM DUAL) and 
oli.active_flag = 'Y' and wlkp.active_flag = 'Y'
order by wlkp.mf_wh_loc_id