将两个提取的值(月和年)与Oracle中某个日期的其他提取的值进行比较

时间:2018-07-12 07:46:24

标签: oracle date stored-procedures

我正在Oracle的存储过程中尝试比较两个数字(都从具有DATE函数的EXTRACT中提取)与另外两个数字(与EXTRACT一起提取),并且我我想检查我是否已经有相同月份和年份的行,但是无论我做什么,我总是会发现一行,即使月份和年份都不一样! 这是我在存储过程之外进行测试的以下代码,DBMS_OUTPUT总是打印出在SELECT COUNT(*)中发现的1种情况:

DECLARE
    VAR_COUNTER NUMBER;
    VAR_MONTH NUMBER;
    VAR_YEAR NUMBER;
BEGIN
   SELECT EXTRACT(MONTH FROM TO_DATE('10/12/2019','DD/MM/YYYY')),EXTRACT(YEAR FROM TO_DATE('10/12/2019','DD/MM/YYYY')) 
   INTO VAR_MONTH,VAR_YEAR FROM DUAL;

   SELECT COUNT(*) 
   INTO VAR_COUNTER 
   FROM FATTURATO_RISTORANTI
   WHERE FATTURATO_RISTORANTI.ID_RISTORANTE = 3
         AND FATTURATO_RISTORANTI.MESE= VAR_MONTH 
         AND FATTURATO_RISTORANTI.ANNO = VAR_YEAR;
   DBMS_OUTPUT.PUT_LINE(VAR_MONTH || ' ' || VAR_YEAR || ' ' || VAR_COUNTER);
END;

P.S。 :mese是提取的MONTH,而anno是提取的YEAR;

3 个答案:

答案 0 :(得分:1)

如果只需要一次这些值,则也可以编写

DECLARE
    contatore NUMBER;
BEGIN

    SELECT COUNT(*)
      INTO contatore
      FROM FATTURATO_RISTORANTI
     WHERE FATTURATO_RISTORANTI.ID_RISTORANTE = 3
           AND FATTURATO_RISTORANTI.MESE = EXTRACT(MONTH FROM DATE '2019-12-10')
           AND FATTURATO_RISTORANTI.ANNO = EXTRACT(YEAR FROM DATE '2019-12-10');

    DBMS_OUTPUT.PUT_LINE(contatore);
END;

或使用

vMese := EXTRACT(MONTH FROM TO_DATE('10/12/2019', 'DD/MM/YYYY'));
vAnno := EXTRACT(YEAR FROM TO_DATE('10/12/2019', 'DD/MM/YYYY'));

FATTURATO_RISTORANTI.ID_RISTORANTE = 3等于3 = FATTURATO_RISTORANTI.ID_RISTORANTE,但更具“可读性”。

答案 1 :(得分:0)

这应该像:

DECLARE
    contatore                                NUMBER;
    vMese                                    NUMBER;
    vAnno                                    NUMBER;
BEGIN
    SELECT EXTRACT(MONTH FROM TO_DATE('10/12/2019', 'DD/MM/YYYY')), EXTRACT(YEAR FROM TO_DATE('10/12/2019', 'DD/MM/YYYY'))
      INTO vMese, vAnno
      FROM DUAL;

    SELECT COUNT(*)
      INTO contatore
      FROM FATTURATO_RISTORANTI
     WHERE     3 = FATTURATO_RISTORANTI.ID_RISTORANTE
           AND FATTURATO_RISTORANTI.MESE = vMese
           AND FATTURATO_RISTORANTI.ANNO = vAnno;

    DBMS_OUTPUT.PUT_LINE(vMese || ' ' || vAnno || ' ' || contatore);
END;

答案 2 :(得分:0)

我显然通过不使用变量解决了我的问题,而不是使用mese和anno,我只是给了表所需的参数,我仍然不知道为什么它如此工作,我需要研究! >