代码之家  ›  专栏  ›  技术社区  ›  Hudhaifa Yoosuf

在动态SQL Oracle中用单引号括起日期

  •  0
  • Hudhaifa Yoosuf  · 技术社区  · 6 年前

    我在oracle软件包中有这段代码,

     PROCEDURE GET_LOGIN
        (
               PIN_FROM_DATE             IN DATE DEFAULT NULL
              ,PIN_TO_DATE               IN DATE DEFAULT NULL
              ,CV_1                      OUT SYS_REFCURSOR
        ) 
        AS      
              LV_SQL long ;     
              LV_SQL_DATE long ;     
        BEGIN
    
        LV_SQL_DATE:='';
    
        IF (PIN_FROM_DATE IS NOT NULL AND PIN_TO_DATE IS NOT NULL)
        THEN 
    
        LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '||   TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd')   ||' AND '|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||' '; 
    
        END IF;
    
        LV_SQL := 'SELECT * FROM LOGIN_DATA '||LV_SQL_DATE;
        OPEN CV_1 FOR LV_SQL;
    
        END GET_LOGIN;
    

    我正在将开始日期和结束日期传递到此 PROCEDURE 并使用between子句运行查询。

    默认日期格式如下 select sysdate from dual; 2018年2月14日

    LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '||   TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd')   ||' AND '|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||' ';  
    

    上面的查询使用sql字符串连接转换的日期。

    这就像

    WHERE TRUNC(LOGIN_DATE) BETWEEN 14-FEB-18 AND 14-FEB-18 ;
    

    它会抛出错误,因为它的预期是这样的

    WHERE TRUNC(LOGIN_DATE) BETWEEN '14-FEB-18' AND '14-FEB-18' ;
    

    如何用单引号连接日期转换?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Jayanth    6 年前

    这很简单。

    您有以下代码:

    LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '||   TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd')   ||' AND '|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||' ';
    

    将其更改为:

    LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '''||   TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd')   ||''' AND '''|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||''' ';
    

    区别在于:使用 ''' 而不是 ' 在附加日期之前

    这正好回答了您的串联问题。

        2
  •  1
  •   PKey    6 年前

    变量 PIN_FROM_DATE,PIN_TO_DATE 已为类型 date -因此,无需再次将其转换为日期。

    我想你可以用这样的东西:

    LV_SQL_DATE := 'WHERE TRUNC(LOGIN_DATE) BETWEEN :my_PIN_FROM_DATE and :my_PIN_TO_DATE' ; 
    

    然后

    OPEN CV_1 FOR LV_SQL using PIN_FROM_DATE,PIN_TO_DATE;
    
        3
  •  1
  •   Kaushik Nayak    6 年前

    我认为这里不需要动态SQL。你的期末考试 CURSOR 相当于。

    OPEN CV_1 FOR SELECT *
    FROM   login_data
    WHERE  ( CASE
               WHEN pin_from_date IS NOT NULL
                    AND pin_to_date IS NOT NULL THEN
                 CASE
                   WHEN TRUNC (login_date) BETWEEN pin_from_date AND pin_from_date
                 THEN 1
                   ELSE 0
                 END
               ELSE 1
             END ) = 1