Sql 根据今天的日期,前几个月应该是完整的,而不是前几个月。为了将来的参考,请在您的问题中包含样本数据。今天有几个输入日期和不同值的预期输出会让你的问题更容易理解。尝试在上面的@APC fiddle()上使用此选项,但是>15部分应该返回JAN,因为它是前两部分
Sql 根据今天的日期,前几个月应该是完整的,而不是前几个月。为了将来的参考,请在您的问题中包含样本数据。今天有几个输入日期和不同值的预期输出会让你的问题更容易理解。尝试在上面的@APC fiddle()上使用此选项,但是>15部分应该返回JAN,因为它是前两部分,sql,oracle,Sql,Oracle,根据今天的日期,前几个月应该是完整的,而不是前几个月。为了将来的参考,请在您的问题中包含样本数据。今天有几个输入日期和不同值的预期输出会让你的问题更容易理解。尝试在上面的@APC fiddle()上使用此选项,但是>15部分应该返回JAN,因为它是前两部分的一部分months@Sight . . . 当我在三月底写这篇文章时,你的问题描述了两个范围:1月1日至3月1日和2月1日至4月1日。如果你真的想要12月1日-3月1日和1月1日-4月1日,那么在第一个案例中使用-3和-2`即可。谢谢@Gor
根据今天的日期,前几个月应该是完整的,而不是前几个月。为了将来的参考,请在您的问题中包含样本数据。今天有几个输入日期和不同
值的预期输出
会让你的问题更容易理解。尝试在上面的@APC fiddle()上使用此选项,但是>15部分应该返回JAN,因为它是前两部分的一部分months@Sight . . . 当我在三月底写这篇文章时,你的问题描述了两个范围:1月1日至3月1日和2月1日至4月1日。如果你真的想要12月1日-3月1日和1月1日-4月1日,那么在第一个案例中使用-3
和-2`即可。谢谢@Gordon。。。我实际上想要一月到二月(如果日期=15),我想我需要的是第一个表达式中的-2
和-2
?@Sight。我编辑了答案。我想你会想要相同的月数,不管我们在哪个月。但是您想改变月数。尝试在()上的@APC fiddle上使用此选项,但是>15部分应该返回JAN,因为它是前两部分的一部分months@Sight . . . 当我在三月底写这篇文章时,你的问题描述了两个范围:1月1日至3月1日和2月1日至4月1日。如果你真的想要12月1日-3月1日和1月1日-4月1日,那么在第一个案例中使用-3
和-2`即可。谢谢@Gordon。。。我实际上想要一月到二月(如果日期=15),我想我需要的是第一个表达式中的-2
和-2
?@Sight。我编辑了答案。我想你会想要相同的月数,不管我们在哪个月。但是你想改变月数。
SELECT * FROM my_table
WHERE
//some conditions AND
my_DATE BETWEEN trunc (sysdate, 'mm')/*current month*/ AND SYSDATE
WHERE
(CASE
when trunc (sysdate, 'dd') < 15 THEN
TO_CHAR(my_DATE, 'MMYYY') BETWEEN TO_CHAR((add_months(sysdate,-3)) AND TO_CHAR((add_months(sysdate,-1))
select t.*
from mytable t
where (to_number(to_char(sysdate, 'dd')) < 15
and t.dt >= add_months(trunc(sysdate, 'mm'),-3)
and t.dt < trunc(sysdate, 'mm')
)
or (to_number(to_char(sysdate, 'dd')) >= 15
and t.dt >= add_months(trunc(sysdate, 'mm'),-2)
and t.dt <= last_day(sysdate)
)
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> select * from test order by id;
ID DATUM
---------- ----------
1 20.12.2020
2 07.01.2021
3 15.02.2021
4 25.02.2021
5 10.03.2021
SQL> select t.id, t.datum
2 from test t
3 where t.datum >=
4 trunc(add_months(date '&&par_sysdate',
5 -case when to_number(to_char(date '&&par_sysdate', 'dd')) < 15 then 2
6 else 1
7 end
8 ), 'mm')
9 and t.datum < case when to_number(to_char(date '&&par_sysdate', 'dd')) < 15 then
10 trunc(date '&&par_sysdate', 'mm')
11 else date '&&par_sysdate'
12 end;
Enter value for par_sysdate: 2021-03-10
ID DATUM
---------- ----------
2 07.01.2021
3 15.02.2021
4 25.02.2021
SQL> undefine par_sysdate
SQL> /
Enter value for par_sysdate: 2021-03-20
ID DATUM
---------- ----------
3 15.02.2021
4 25.02.2021
5 10.03.2021
SQL>
SQL> select t.id, t.datum
2 from test t
3 where t.datum >=
4 trunc(add_months(sysdate,
5 -case when to_number(to_char(sysdate, 'dd')) < 15 then 2
6 else 1
7 end
8 ), 'mm')
9 and t.datum < case when to_number(to_char(sysdate, 'dd')) < 15 then
10 trunc(sysdate, 'mm')
11 else sysdate
12 end;
ID DATUM
---------- ----------
3 15.02.2021
4 25.02.2021
5 10.03.2021
SQL>
where datecol >= add_months(trunc(sysdate, 'MON'),
(case when extract(day from sysdate) < 15 then -2 else -1 end)
) and
datecol < add_months(trunc(sysdate, 'MON'),
(case when extract(day from sysdate) < 15 then 0 else 1 end)
)
where datecol >= add_months(trunc(sysdate, 'MON'), -2) and
datecol < add_months(trunc(sysdate, 'MON'),
(case when extract(day from sysdate) < 15 then 0 else 1 end)
)