如何在Oracle中选择特定日期

时间:2015-01-31 05:16:47

标签: sql oracle date

我想在Oracle数据库中仅选择第1和第20个日期。 这是我的询问。

SELECT INVOICE_DATE 
FROM invoice_debt@stilng1_lngrpt2 
WHERE INVOICE_DATE = TO_DATE('01', 'DD')
AND INVOICE_DATE = TO_DATE('20','DD')
AND INVOICE_DATE > TO_DATE('30-12-2010', 'DD-MM-YYYY')
AND INVOICE_DATE IS NOT NULL GROUP BY INVOICE_DATE 
ORDER BY INVOICE_DATE DESC;

我的查询运行:

  1. 仅选择第一个日期
  2. 仅选择第20个日期
  3. 选择日期> 30-12-2010
  4. 但没有任何记录返回。

    我尝试使用EXTRACT获取DATE日期,但我无法使用WHERE条款。

    SELECT 
    EXTRACT(DAY FROM TO_DATE(INVOICE_DATE, 'DD-MM-YY')) as DAY_EXTRACT 
    FROM invoice_debt@stilng1_lngrpt2;
    

    请帮帮我谢谢。 :)

2 个答案:

答案 0 :(得分:2)

对日期使用OR条件,因为您不能将相同的invoice_date设置为第1天和第20天,并且也使用to_char作为发票日期,因为to_date只返回一个日期

SELECT INVOICE_DATE 
FROM invoice_debt@stilng1_lngrpt2 
WHERE (to_char(INVOICE_DATE, 'DD')='01'
OR to_char(INVOICE_DATE,'DD')='20')
AND INVOICE_DATE > TO_DATE('30-12-2010', 'DD-MM-YYYY')
AND INVOICE_DATE IS NOT NULL GROUP BY INVOICE_DATE 
ORDER BY INVOICE_DATE DESC;

答案 1 :(得分:1)

  

提取(截止日期为_DATE(_发送日期=< 39; DD-MM-YY'))

这没有任何意义。您正在将DATE转换为DATE。我希望INVOICE_DATE列是 DATE数据类型。所以只需从中提取一天 -

extract(day from INVOICE_DATE)

1st/20th天选择需要 OR 条件, AND 条件需要条件TO_DATE('30-12-2010', 'DD-MM-YYYY')来过滤日期。

但是,您需要确保您的查询使用有效的执行计划。

  1. 在日期coumn上使用 TO_CHAR 功能将禁止任何正常索引使用。
  2. 您需要在to_char(INVOICE_DATE, 'DD')

    上设置基于功能的索引
    WHERE (to_char(INVOICE_DATE, 'DD')='01' 
             OR  to_char(INVOICE_DATE,'DD')='20')
          AND  INVOICE_DATE > TO_DATE('30-12-2010', 'DD-MM-YYYY')) 
          AND  INVOICE_DATE IS NOT NULL
    
    1. 由于您只想获得大于年2010的日期,我认为指定 RANGE 会使用日期列上的索引来获取 INDEX RANGE SCAN < /强>
    2. 您可以尝试这些建议并检查解释计划。