在查询中SQL很多sysdate

时间:2015-12-23 09:27:37

标签: sql oracle

我有一个很多sysdate的大查询,每次我必须检查一些sysdate(+ 1 + 2 + 3等)我必须在每个部分更改我失去了很多时间,我想创建一个变量或者在我的查询之上使用唯一的sysdate更改查询中的每个sysdate。

这只是一个例子

SELECT DISTINCT(COD) 
      FROM TABLE_COD 
      WHERE START_DATE <= trunc(sysdate + 5) 
      AND END_DATE >= trunc(sysdate + 5)
      AND VALUE = 1
      AND (COD_REF = ( SELECT to_char(sysdate + 5, 'D') FROM dual)  OR  COD_REF = 0)
.......continue

6 个答案:

答案 0 :(得分:1)

您可以加入日期:

select ...
from ...
cross join (select trunc(sysdate) + 5 as mydate from dual)
where start_date <= mydate
and end_date >= mydate
and value = 1
and cod_ref in (to_char(mydate, 'D', 'NLS_DATE_LANGUAGE=AMERICAN'), 0)
...

另请注意我已将NLS_DATE_LANGUAGE添加到TO_CHAR,否则输出将取决于会话(即一个会话可能会将星期日视为一周的第一天,另一个星期一)。< / p>

答案 1 :(得分:1)

如果我理解你的问题,你需要这样的东西。

with sysdate_plus_n as 
(select sysdate+1 as sysdate_plus_1 ,-- other variables
        sysdate+5 as sysdate_plus_5 from dual)
--This is a temporary table. So if you query 
--(select sysdate_plus_5 from sysdate_plus_n), you will get sysdate+5
--You can change your values in this temporary table

SELECT DISTINCT(COD) 
      FROM TABLE_COD 
      WHERE START_DATE <= trunc(select sysdate_plus_5 from sysdate_plus_n) 
      AND END_DATE >= trunc(select sysdate_plus_5 from sysdate_plus_n)
      AND VALUE = 1
      AND (COD_REF = ( SELECT to_char(select sysdate_plus_5 from sysdate_plus_n, 'D')
      FROM dual)  OR  COD_REF = 0)
.......continue

现在只需更改临时表中的值即可。你不必触摸查询。

答案 2 :(得分:0)

使用替换变量,即&,并在提示时输入值。因此,您只需输入一次值,它将在代码中的任何位置同时使用。

例如,

SQL> SELECT &dt FROM dual;
Enter value for dt: SYSDATE
old   1: SELECT &dt FROM dual
new   1: SELECT SYSDATE FROM dual

SYSDATE
---------
23-DEC-15

SQL> /
Enter value for dt: SYSDATE +5
old   1: SELECT &dt FROM dual
new   1: SELECT SYSDATE +5 FROM dual

SYSDATE+5
---------
28-DEC-15
  

AND(COD_REF =(SELECT to_char(sysdate + 5,'D')FROM dual)或COD_REF = 0)

另外,您不必一直使用子查询 SYSDATE 是一个内置函数,因此您可以直接调用它。无需从双重选择。

AND (COD_REF = to_char(sysdate + 5, 'D') OR  COD_REF = 0)

答案 3 :(得分:0)

如果您希望一次多天,那么为此目的编写一个查询怎么样?像这样:

WITH params AS (
      SELECT 5 as val FROM DUAL UNION ALL
      SELECT 6 as val FROM DUAL
     )
SELECT DISTINCT v.val, COD
FROM params CROSS JOIN
     TABLE_COD c
WHERE START_DATE <= trunc(sysdate + params.val) AND END_DATE >= trunc(sysdate + params.val) AND
      VALUE = 1 AND
      (COD_REF = (to_char(sysdate + params.val, 'D') OR  COD_REF = 0);

使用此结构,您可以根据需要为查询添加任意数量的值(仅包括一个)。

答案 4 :(得分:0)

据我所知,SYSDATE的值仅在实际运行查询之前计算一次。换句话说,在整个查询过程中,SYSDATE的值将保持不变。了解这些细节可能会极大地帮助或解决您的问题。

我认为在您的情况下,最好的解决方案是创建一个用户函数,以便在select语句中多次调用。然后,当您需要任何更改时,只需更新该功能。

我认为没有办法在查询开头创建变量,以便在单个语句中重复使用。但是,您可以使用WITH子句,以避免重复嵌入查询并提高性能和易读性。这与您的需求类似,但想提及它,因为它可能也是一种解决方案,具体取决于您的需求。

有关Oracle功能的更多信息,请查看此链接: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htm

我希望这有帮助!

答案 5 :(得分:-1)

Dim ticket_handle As String = " CR 1001 " ws.closeTicket ( Sid , " closed ticket " ticket_handle )

修复TRUNC(SYSDATE)或简单的SYSDATE(我不知道您的查询的剩余部分,因为有&#34; ...继续&#34;那里)然后根据需要多次使用它在您的主要查询。