动态SQL Oracle中的单引号的环绕日期

时间:2018-02-14 06:06:18

标签: oracle date concatenation

我在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并运行带有子句的查询。

默认日期格式为此 select sysdate from dual; 14-FEB-18

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 string连接起来。

就像

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 个答案:

答案 0 :(得分:1)

变量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;

答案 1 :(得分:1)

我认为你不需要动态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  

答案 2 :(得分:1)

非常简单。

你有这个代码:

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') ||''' ';

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

这只是回答你的连接问题。