你能帮帮我吗?
当我在Toad中执行下面的.sql文件时,它会给我预期的结果。
with
a as(select extract(year from sysdate)var_year,to_char(sysdate,'mm-dd')var_day from dual),
b as(select case when var_day between '10-01'and '12-31'
then to_date(var_year||'-10-01','yyyy-mm-dd')
else to_date(var_year-1||'-10-01','yyyy-mm-dd')end d1,
case when var_day between'10-01'and'12-31'
then to_date(var_year+1||'-09-30','yyyy-mm-dd')
else to_date(var_year||'-09-30','yyyy-mm-dd')end d2
from a)
select * from b,SCHEMA.TABLE1
where SCHEMA.TABLE1.DATE_FRAIS between b.d1 and b.d2;
但是当我尝试使用添加假脱机功能的.cmd作业启动它时,控制台会打开,但没有任何反应,控制台保持打开状态。生成.csv文件但内部没有。
请查看以下脚本无效(假脱机成功,但没有内容):
SET FEEDBACK OFF
set heading on
SET PAGESIZE 0
SET LINESIZE 8000
set pagesize 50000
SET COLSEP ";"
COLUMN dcol new_value mydate noprint
select to_char(sysdate,'YYYY_MM_DD') dcol from dual;
SPOOL test.csv;
with
a as(select extract(year from sysdate)var_year,to_char(sysdate,'mm-dd')var_day from dual),
b as(select case when var_day between '10-01'and '12-31'
then to_date(var_year||'-10-01','yyyy-mm-dd')
else to_date(var_year-1||'-10-01','yyyy-mm-dd')end d1,
case when var_day between'10-01'and'12-31'
then to_date(var_year+1||'-09-30','yyyy-mm-dd')
else to_date(var_year||'-09-30','yyyy-mm-dd')end d2
from a)
select * from b,SCHEMA.TABLE1
where SCHEMA.TABLE1.DATE_FRAIS between b.d1 and b.d2;
SPOOL OFF
然而,当我推出一个简单的" .ql文件通过.cmd作业添加一个假脱机功能,它可以工作(可能是因为我删除了" CASE"?)。生成.csv文件并且里面有内容
请在下面找到脚本工作的示例(线轴成功与内容):
SET FEEDBACK OFF
set heading on
SET PAGESIZE 0
SET LINESIZE 8000
set pagesize 50000
SET COLSEP ";"
COLUMN dcol new_value mydate noprint
select to_char(sysdate,'YYYY_MM_DD') dcol from dual;
SPOOL test.csv;
with
a as (select extract(year from sysdate) var_year1, extract(year from sysdate) var_year2, to_char(sysdate) var_day from dual)
select * from a;
SPOOL OFF
答案 0 :(得分:2)
可能只是您的查询需要很长时间来检索所有结果,而且您还没有足够长的时间吗?您可能会在Toad中看到结果,但是您是否尝试过结果集的末尾,而不是仅获取前500行(或者您设置Toad以检索每次获取的数量)。
我怀疑这个问题与WITH
条款有什么关系。无论如何,没有必要;您可以像这样简单地操作sysdate,以获得结果:
select *
from SCHEMA.TABLE1 t1
where t1.DATE_FRAIS between add_months(trunc(add_months(sysdate, 3), 'yyyy'), -3)
and add_months(trunc(add_months(sysdate, 3), 'yyyy'), 9) -1;
N.B。我希望您的DATE_FRAIS专栏没有时间元素,否则您将错过每年9月30日午夜之后的任何内容。
答案 1 :(得分:2)
我怀疑(a)您将其作为sqlplus -s user/pass @script
运行,并且在脚本末尾没有exit
,这将导致命令窗口保持打开状态; (b)您在今年的日期范围内没有任何承诺数据。如果您在Toad会话中添加数据并在那里运行查询但未提交这些更改,您会看到这种效果 - 在这种情况下,新插入的数据对任何其他会话都不可见,因此您的SQL * Plus查询不会看不到。而且由于你有反馈意见,你甚至不会看到'没有选择行'。
@ boneist的简化比我的简化更简洁,但我会留下来展示CTE和非CTE,以及between
和>=
/ <
变体。< / p>
顺便提一下,您可以将日期计算简化为:
with b as (
select add_months(trunc(sysdate, 'YYYY'),
case when extract(month from sysdate) < 10 then -3 else 9 end) d1,
last_day(add_months(trunc(sysdate, 'YYYY'),
case when extract(month from sysdate) < 10 then 8 else 20 end)) d2
from dual
)
select *
from b
join table1 on table1.date_frais between b.d1 and b.d2;
您可以使用this demo查看CTE为各个日期生成的开始日期和结束日期。我认为这就是你所追求的,如果我interpreted your current query正确的话。 (和here is the same query with @boneist's simplification)。
或者,如果您不想显示日期范围以及table1
的实际数据,请将计算移至过滤器中:
select * -- but still better to list the columns
from table1
where date_frais >= add_months(trunc(sysdate, 'YYYY'),
case when extract(month from sysdate) < 10 then -3 else 9 end)
and date_frais < add_months(trunc(sysdate, 'YYYY'),
case when extract(month from sysdate) < 10 then 9 else 21 end);
我还将此版本从between
更改为使用>=
和<
,并将结束日期推迟了一天;这将包括最后一个月的最后一天有午夜后的时间的任何值(我看到@boneist也评论过)。如果您的日期都是午夜,那么between
会起作用,但我仍然更喜欢这种明确的模式,并且我认为月调整计算也更加明显。