我想知道如何进行查询,我可以在其中选择从 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 日到上周日的数据?
答案 0 :(得分:1)
您可以 TRUNC
ate 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<>fiddle here
答案 1 :(得分:1)
按照我的理解,您正在寻找行生成器。如果是这样,那么你来了:
首先,一些设置(正如我的数据库说克罗地亚语);你不会那样做:
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 日到上周日的数据?
让我们假设距今天还有两天,即 16.06.2021(星期三)。我现在以特权用户身份连接,以便我可以更改系统日期(您不会这样做):
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>
我觉得还行。
答案 2 :(得分:-1)
您可以在下面使用 where 子句 -
WHERE start_date BETWEEN TO_DATE('2021-01-01', 'yyyy-mm-dd') AND (TRUNC(SYSDATE) - TO_CHAR(SYSDATE, 'd'));