Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询中的多个sysdate_Sql_Oracle - Fatal编程技术网

SQL查询中的多个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

我有一个包含许多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
您可以加入日期:

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:您能告诉我我的答案有什么问题吗?你问戈登如何更改他的查询,他比我晚发布了一个小时,所以只需更改一个号码。你为什么不用我的答案,因为它已经只有一个数字了?关于我的回答,你有什么不明白的吗?或者还缺少什么?