在 oracle sql 中获取从第一个月到当前日期的数据

get the data starting from 1st month till current date in oracle sql

我在下面写了查询,它工作正常,并且它在前一周每次都获取数据。

    select t.day_id 
    from F_TIME t 
    where t.day_id >= TO_NUMBER (TO_CHAR( TRUNC ( SYSDATE , ''IW'' ) - 7 , ''YYYYMMDD'' )) 
                      and t.day_id <  TO_NUMBER ( TO_CHAR ( TRUNC ( SYSDATE , ''IW'' ), ''YYYYMMDD'' ))

但现在我想重写此查询,使其始终获取从每月 1 日到 sysdate 的数据。因此,例如,如果我现在 运行 这个查询,我应该获取从 2018 年 1 月 1 日到 2018 年 1 月 11 日的数据。

如果我 运行 在 2 月 1 日进行此查询,那么它将 return 整月 January.I 的数据 我不确定是否可以在单个查询中执行。

dayid 是数字数据类型,格式例如 20170815

我只熟悉MSSQL,对Oracle了解不多。如果我必须在 MS SQL 中执行此操作,我最终会使用今天的日期作为文本并根据需要进行修改。

这是一个 MS SQL 兼容示例。抱歉,我不得不将它转换为 Oracle,但希望这个想法有意义并且 Oracle 中有等效的函数。

select CONCAT(DATEPART(month, GETDATE()),'/1/', DATEPART(year, GETDATE()))

这是一个如何使用它的例子:

select * from MyTable
where timestamp > CONCAT(DATEPART(month, GETDATE()),'/1/', DATEPART(year, GETDATE()))

对于 yyyymmdd 的 day_id 格式,您可以使用以下内容:

   select day_id                  
     from F_TIME
    where to_date(day_id,'yyyymmdd') between to_date(to_char(sysdate,'yyyymm')||'01','yyyymmdd') and trunc(sysdate)
    order by to_date(day_id,'yyyymmdd') 

D e m o 1

即使 day_id 是数字格式(不是字符串),上面的 sql 也可以,为此你可以看看这个:

D e m o 2

在 Oracle 中,表达式 TRUNC(datestamp, 'MM') 将任何日期时间表达式转换为该月第一天的午夜。

如果您有日期戳,您的日期选择逻辑将如下所示。

 WHERE datestamp >= TRUNC(SYSDATE, 'MM')

获取当月的所有内容。

这会为您提供前一个月的所有信息。

WHERE datestamp >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1)
  AND datestamp <  TRUNC(SYSDATE, 'MM')

请注意使用 < 表示该时间间隔的结束。您不能将 BETWEEN 用于此类日期范围。

编辑 看起来你的 day_id 是八位数字 YYYYMMDD。因此,您需要将开始日期和结束日期转换为该格式。

WHERE day_id>= TO_NUMBER(TO_CHAR(TRUNC(SYSDATE, 'MM'), 'YYYYMMDD'))

WHERE day_id >= TO_NUMBER(TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1), 'YYYYMMDD'))
  AND day_id <  TO_NUMBER(TO_CHAR(TRUNC(SYSDATE, 'MM'), 'YYYYMMDD'))

专业提示:尽可能使用 DBMS 提供的日期时间数据类型。如您所见,使用这些数据类型的查询比其他可能性更易于阅读和 explain to your rubber duck

要获取当月的第一天,您只需将第一个 TRUNC(SYSDATE,'IW') 转换为 TRUNC(SYSDATE,'MM'),如果您想要上个月的数据,则将 -7 转换为 -1如果 运行 在当月的第一天。

然后你想获取数据直到sysdate,所以再次打开TRUNC(SYSDATE)中的第二个TRUNC(SYSDATE,'IW'):

SELECT t.day_id 
  FROM F_TIME t 
 WHERE t.day_id >= TO_NUMBER (TO_CHAR( TRUNC ( SYSDATE - 1 , 'MM' ) , 'YYYYMMDD' )) 
   AND t.day_id <= TO_NUMBER ( TO_CHAR ( TRUNC ( SYSDATE ), 'YYYYMMDD' ));

编辑:

<<= 今天。

这样,如果您 运行 在 2 月 1 日查询,您将得到整个 1 月和 2 月 1 日:如果您想排除 2 月 1 日(即今天),您必须添加 CASE WHEN声明。

您可以使用以下策略轻松获取一个月的第一天:

    SELECT 
        ADD_MONTHS( LAST_DAY ( TO_DATE('20220228', 'yyyymmdd') ) + 1, -1) AS "FIRST_DAY"
    FROM dual

哪个returns:

        FIRST_DAY
    1   01/02/2022