我被困在这一点上,可能需要建议/帮助:
基本上,尝试将日期设置为变量,然后在查询的“WHERE”部分使用该日期变量运行select语句。不确定是否应该使用if或CASE,或者两者都不使用?如果是星期一,我想运行一套日期(上个星期四和星期五)任何其他日子(只有sysdate-2和sysdate-1),任何帮助都是非常感谢的!
代码如下:
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;发布于 2018-07-31 02:16:14
你混合了变量/函数和字符串。这应该是可行的。
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)。
发布于 2018-07-31 02:48:53
为此,您实际上不需要变量,也不需要PL/SQL;您可以在where子句中使用case表达式计算日期:
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包装器,您可以做同样的事情,但是您要么必须将结果选择到一个集合中,要么使用引用游标将结果集返回给调用者。不过,还不清楚你是否真的需要或想要这样做。
发布于 2018-07-31 18:39:56
你有没有试过选择你的变量?
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;https://stackoverflow.com/questions/51599612
复制相似问题