我有一个很多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
答案 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;那里)然后根据需要多次使用它在您的主要查询。