首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL SQL 'IF or CASE‘使用可变日期

PL SQL 'IF or CASE‘使用可变日期
EN

Stack Overflow用户
提问于 2018-07-31 01:48:07
回答 3查看 767关注 0票数 0

我被困在这一点上,可能需要建议/帮助:

基本上,尝试将日期设置为变量,然后在查询的“WHERE”部分使用该日期变量运行select语句。不确定是否应该使用if或CASE,或者两者都不使用?如果是星期一,我想运行一套日期(上个星期四和星期五)任何其他日子(只有sysdate-2和sysdate-1),任何帮助都是非常感谢的!

代码如下:

代码语言:javascript
复制
DECLARE
today_date number;
start_date date;
end_date date;

BEGIN
today_date := to_char(sysdate, 'D');
start_date := case when today_date ='2' then 'sysdate-4' else 'sysdate-2' 
end;
end_date := case when today_date ='2' then 'sysdate-3' else 'sysdate-1' end;

SELECT COLUMN A, COLUMN B, COLUMN C, COLUMN D
FROM /*csv*/REPORT_NAME
WHERE COLUMN B between trunc(start_date)+21/24 and trunc(end_date)+21/24 and 
BOOK_NAME = 'xxxxxx' and SERVER = 'xxxxxx' and EX_ACTION = 'xxxxx';

end;
EN

回答 3

Stack Overflow用户

发布于 2018-07-31 02:16:14

你混合了变量/函数和字符串。这应该是可行的。

代码语言:javascript
复制
DECLARE
today_date number;
start_date date;
end_date date;

BEGIN
today_date := to_char(sysdate, 'D');
start_date := case when today_date ='2' then sysdate-4 else sysdate-2 
end;
end_date := case when today_date ='2' then sysdate-3 else sysdate-1 end;

/* this won't work without declaring a cursor, and returning it to the client
SELECT COLUMN A, COLUMN B, COLUMN C, COLUMN D
FROM REPORT_NAME
WHERE COLUMN B between trunc(start_date)+21/24 and trunc(end_date)+21/24 and 
BOOK_NAME = 'xxxxxx' and SERVER = 'xxxxxx' and EX_ACTION = 'xxxxx';
*/
end;

注意,你也有一些隐式的类型转换。today_date可能应该改为char(1)

票数 2
EN

Stack Overflow用户

发布于 2018-07-31 02:48:53

为此,您实际上不需要变量,也不需要PL/SQL;您可以在where子句中使用case表达式计算日期:

代码语言:javascript
复制
SELECT /*csv*/ COLUMN_A, COLUMN_B, COLUMN_C, COLUMN_D
FROM REPORT_NAME
WHERE COLUMN_B >= trunc(sysdate) - case to_char(sysdate, 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH')
                    when 'Mon' then 4 else 2 end + 21/24
  AND COLUMN_B <  trunc(sysdate) - case to_char(sysdate, 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH')
                    when 'Mon' then 3 else 1 end + 21/24
  AND BOOK_NAME = 'xxxxxx'
  AND SERVER = 'xxxxxx'
  AND EX_ACTION = 'xxxxx';

我擅自将逻辑从基于日期数字2更改为具有特定日期缩写,因为D返回的值基于您的NLS设置,因此它可能会因运行您的代码的其他人而不同(并产生意想不到的结果)。由于日期名称和缩写也依赖于NLS,我已经指定了要使用的语言。(不幸的是,您不能指定如何以相同的方式使用D )。

我稍微更改了时间窗口,从一天的晚上9点到第二天的晚上9点。如果您使用between,那么它在两端都是包含的,所以在连续的几天运行,您可以在重叠日期的21:00:00获取任何数据。这可能不是您想要的(但如果确实是这样,只需将<更改为<=,或者根据您的喜好恢复到两者之间...)。

如果您需要一个PL/SQL包装器,您可以做同样的事情,但是您要么必须将结果选择到一个集合中,要么使用引用游标将结果集返回给调用者。不过,还不清楚你是否真的需要或想要这样做。

票数 2
EN

Stack Overflow用户

发布于 2018-07-31 18:39:56

你有没有试过选择你的变量?

代码语言:javascript
复制
DECLARE
   TODAY_DATE   NUMBER;
   START_DATE   DATE;
   END_DATE     DATE;
BEGIN
   TODAY_DATE := TO_CHAR (SYSDATE, 'D');

   SELECT CASE WHEN TODAY_DATE = '2' THEN SYSDATE - 4 ELSE SYSDATE - 2 END,
          CASE WHEN TODAY_DATE = '2' THEN SYSDATE - 3 ELSE SYSDATE - 1 END
   INTO START_DATE, END_DATE
   FROM DUAL;

   SELECT COLUMN_A, COLUMN_B, COLUMN_C, COLUMN_D
   FROM REPORT_NAME /*csv*/
   WHERE     COLUMN_B BETWEEN TRUNC (START_DATE) + 21 / 24
                          AND TRUNC (END_DATE) + 21 / 24
         AND BOOK_NAME = 'xxxxxx'
         AND SERVER = 'xxxxxx'
         AND EX_ACTION = 'xxxxx';
END;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51599612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档