我想知道如何进行查询,从21年1月1日到上周,我可以选择数据。我试着把它放在日期过滤器中,如下所示:
where start_date between TO_DATE('2021-01-01', 'yyyy-mm-dd')
and TO_DATE('2021-06-13', 'yyyy-mm-dd')
但我必须每周手动输入才能更改结束日期,我想知道是否有更有效的方法从今天的一周中选择上周之前的数据(意味着周日之前的数据(,这样即使我在今天之后两天运行查询,我也只能获得1月1日到上周日的数据?
您可以TRUNC
将SYSDATE
推迟到ISO周的开始(通常是星期一(,然后找到小于该值的值:
SELECT *
FROM table_name
WHERE start_date >= DATE '2021-01-01'
AND start_date < TRUNC( SYSDATE, 'IW' )
这样做的优点是它独立于语言和位置,因此无论数据库或用户会话是否有任何设置,查询的行为都将完全相同。
它还将获得所有周日可能出现的值(从00:00:00
到23:59:59
(。
如果您想要当前年份开始时的值(而不是2021-01-01
的固定下限(,则可以使用:
SELECT *
FROM table_name
WHERE start_date >= TRUNC( SYSDATE, 'YYYY' )
AND start_date < TRUNC( SYSDATE, 'IW' )
db<gt;小提琴这里
按照我的理解,您正在寻找行生成器。如果是这样的话,给你:
首先,一些设置(因为我的数据库讲克罗地亚语(;你不会那样做的:
SQL> alter session set nls_date_format = 'dd.mm.yyyy, day';
Session altered.
SQL> alter session set nls_date_language = 'english';
Session altered.
查询自身,结果:
SQL> select trunc(sysdate, 'yyyy') + level - 1 as datum
2 from dual
3 connect by level <= next_day(trunc(sysdate) - 7, 'sunday') - trunc(sysdate, 'yyyy') + 1
4 order by datum;
DATUM
---------------------
01.01.2021, friday
02.01.2021, saturday
03.01.2021, sunday
04.01.2021, monday
05.01.2021, tuesday
06.01.2021, wednesday
07.01.2021, thursday
08.01.2021, friday
<snip>
09.06.2021, wednesday
10.06.2021, thursday
11.06.2021, friday
12.06.2021, saturday
13.06.2021, sunday
164 rows selected.
SQL>
正如您所说:
这样,即使我从今天起两天运行查询,我也只能得到1月1日到上周日的数据?
让我们假设距离今天还有两天,即2021年6月16日(星期三(。我现在以特权用户的身份连接,这样我就可以更改系统的日期(你不会这么做的(:
SQL> alter system set fixed_date = '16.06.2021';
System altered.
SQL> alter session set nls_date_language = 'english';
Session altered.
SQL> alter session set nls_date_format = 'dd.mm.yyyy, day';
Session altered.
SQL> select sysdate from dual;
SYSDATE
---------------------
16.06.2021, wednesday
看到了吗?星期三
让我们再次尝试相同的查询:
SQL> select trunc(sysdate, 'yyyy') + level - 1 as datum
2 from dual
3 connect by level <= next_day(trunc(sysdate) - 7, 'sunday') - trunc(sysdate, 'yyyy') + 1
4 order by datum;
DATUM
---------------------
01.01.2021, friday
02.01.2021, saturday
03.01.2021, sunday
04.01.2021, monday
<snip>
11.06.2021, friday
12.06.2021, saturday
13.06.2021, sunday
164 rows selected.
SQL>
我觉得还可以。
您可以使用下面的where子句-
WHERE start_date BETWEEN TO_DATE('2021-01-01', 'yyyy-mm-dd') AND (TRUNC(SYSDATE) - TO_CHAR(SYSDATE, 'd'));