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

时间:2021-06-14 19:22:46

标签: sql oracle date

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

3 个答案:

答案 0 :(得分:1)

您可以 TRUNCate SYSDATE 到 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<>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'));