SQL查询中的多个sysdate
我有一个包含许多sysdate的大查询,每次我必须检查一些sysdate+1+2+3等,我必须在每个部分进行更改,并且我损失了很多时间,我想在我的查询上创建一个变量或具有唯一sysdate的东西,它更改查询中的每个sysdate 这是作为例子的一小部分SQL查询中的多个sysdate,sql,oracle,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
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
您可以加入日期:
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_语言添加到了_CHAR,因为否则输出将取决于会话,即一个会话可能将星期日视为一周的第一天,另一个星期一。使用替换变量,即&并在提示时输入值。因此,您将只输入一次值,并且它将在代码中的任何位置同时使用
比如说,
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
而COD_REF=从dual或COD_REF=0选择到_charsysdate+5,'D'
另一方面,您不必一直使用子查询。SYSDATE是一个内置函数,因此您可以直接调用它。无需从双重选择
AND (COD_REF = to_char(sysdate + 5, 'D') OR COD_REF = 0)
如果我正确理解你的问题,你需要这样的东西
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
现在只需更改临时表中的值。您不必触摸查询。如果您想要一次多天,那么为此编写一个查询如何?大概是这样的:
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);
使用此结构,您可以向查询添加任意多个值,其中仅包括一个值
WITH FIX_SYSDATE AS
(SELECT TRUNC(SYSDATE) AS FIXED_SYSDATE
FROM DUAL)
SELECT DISTINCT(COD)
FROM TABLE_COD
CROSS JOIN FIX_SYSDATE FS
WHERE START_DATE <= FS.FIXED_SYSDATE + 5
AND END_DATE >= FS.FIXED_SYSDATE + 5
AND VALUE = 1
AND (COD_REF = (SELECT TO_CHAR(FS.FIXED_SYSDATE + 5, 'D')
FROM DUAL)
OR COD_REF = 0)
.......continue
修复TRUNCSYSDATE或简单的SYSDATE我不知道查询的剩余部分,因为有。。。继续,然后根据需要在主查询中多次使用它。据我所知,SYSDATE的值在实际运行查询之前只计算一次。换句话说,SYSDATE的值将在整个查询过程中保持不变。了解这些细节可能会大大帮助或解决您的问题 我确实认为在您的情况下,最好的解决方案是创建一个用户函数,以便在select语句中调用任意次数。然后,当您需要任何更改时,只需更新函数即可 我认为没有一种方法可以在查询的开头创建一个变量,以便在一条语句中重用。但是,您可以使用WITH子句,以避免重复嵌入式查询,并提高性能和易于阅读。这与您所需要的类似,但希望提及它,因为它也可能是一个解决方案,取决于您的需要 有关Oracle功能的更多信息,请查看此链接:
我希望这有帮助 您可以显示您的代码吗?您的意思是什么,更改系统日期?这是从表中选择DISTINCTCOD的一小部分,其中START\u DATE=truncsysdate+5,VALUE=1,COD\u REF=SELECT到\u charsysdate+5,从dual或COD\u REF=0可以只在顶部创建一个简单的变量吗?示例val=5?我的研究是可变的,有时我必须在其他sysdate+32中检查sysdate+5,并且我必须在查询中只替换数字。@nowaySync。是的,如果您愿意,params只能有一行和一个值。@nowaySync:您能告诉我我的答案有什么问题吗?你问戈登如何更改他的查询,他比我晚发布了一个小时,所以只需更改一个号码。你为什么不用我的答案,因为它已经只有一个数字了?关于我的回答,你有什么不明白的吗?或者还缺少什么?