如何选择2021年1月1日至上周的记录



我想知道如何进行查询,从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日到上周日的数据?

您可以TRUNCSYSDATE推迟到ISO周的开始(通常是星期一(,然后找到小于该值的值:

SELECT *
FROM   table_name
WHERE  start_date >= DATE '2021-01-01'
AND    start_date <  TRUNC( SYSDATE, 'IW' )

这样做的优点是它独立于语言和位置,因此无论数据库或用户会话是否有任何设置,查询的行为都将完全相同。

它还将获得所有周日可能出现的值(从00:00:0023: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'));

相关内容

  • 没有找到相关文章

最新更新