【问题标题】:get the data starting from 1st month till current date in oracle sql在oracle sql中获取从第1个月到当前日期的数据
【发布时间】:2018-06-21 00:59:12
【问题描述】:

我在下面编写了运行良好的查询,并且它在前一周每次都获取数据。

    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 日运行此查询,那么它将返回一月份的整个月份的数据。我不确定它是否可以在单个查询中进行。

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

【问题讨论】:

  • 能否提供样本数据的cte?
  • day_id 是什么数据类型?日期、字符串、数字?每个人的答案都不一样。
  • day_id 为数字数据类型,数据存储格式为 20040501
  • edit您的问题更具体地指定您所需的日期范围。如果您在2018-01-11 上运行查询,应该包括什么第一个和最后一个日期?如果您在2018-03-30 上运行查询,应该包括哪些日期(最后一个是一个技巧问题)。

标签: sql oracle datetime date-comparison sysdate


【解决方案1】:

我只熟悉MS SQL,不太了解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()))

【讨论】:

    【解决方案2】:

    对于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

    【讨论】:

    • 但是我如何在我的表查询中使用这个例子。看起来有点复杂
    • day_id 的值是多少?
    • 它的格式类似于例如 20170815 ..我只是运行您的查询它返回的日期太多。并且不能在 where 子句中而不是在 select 子句中限制查询。因为我想在很多地方使用这个逻辑进行比较
    • 它返回空值,我们不能在 where 子句而不是 select 子句中编写逻辑吗?即使我从每月的第一天到当前日期获取数据,也可以。
    • 我收到错误为 ORA-01840:输入值对于日期格式来说不够长。请注意 day_id 是数字数据类型,其格式为例如 20170815
    【解决方案3】:

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

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

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

    在本月为您提供一切。

    这会为您提供上个月的所有内容。

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

    注意在该时间间隔结束时使用&lt;。您不能将BETWEEN 用于此类日期范围。

    编辑看起来您的day_ids 是八位数字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

    【讨论】:

    • 无耻的自我宣传:我写了一篇关于这个主题的博文。 plumislandmedia.net/sql-time-processing/…
    • day_id 是数字数据类型,数据以 20170815 的格式存储,因此我收到数据类型不一致的错误
    • 查询正在运行,但没有给出预期的输出。它返回 2017 年 12 月整月的数据。实际上,我每次都想要从 1 月 1 日到当前日期的结果,例如从 1 月 1 日到今天。这是第一种情况,我认为第二种情况不会得到满足,例如,如果我在 2 月 1 日运行此查询,那么它应该返回 1 月的整个月份的数据。如果我在 2 月 2 日运行此查询,那么它应该返回日期2 月 1 日和 2 月 2 日。我不确定是否可以在单个查询中执行此操作
    【解决方案4】:

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

    那你想获取到 sysdate 之前的数据,所以再次将第二个TRUNC(SYSDATE,'IW') 转入TRUNC(SYSDATE)

    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' ));
    

    编辑:

    今天将&lt; 转为&lt;=

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

    【讨论】:

    • 当我运行这个查询时,它给出的日期是从 2018 年 1 月 1 日到 2018 年 1 月 11 日,而不是直到今天,即 2018 年 1 月 12 日。也只是想确认如果我在 2 月 1 日运行此查询,那么应该它返回一月份的整个月份的数据?如果我在 2 月 2 日运行此查询,那么它应该返回 2 月 1 日和 2 月 2 日的日期吗?
    • 感谢它现在的工作,只是想知道我是否在 2 月 2 日运行查询,例如,它将返回 2 月 1 日和 2 月 2 日的日期,而不是 1 月?只有当我在 2 月 1 日运行此查询时,它才会返回整个 1 月和 2 月 1 日的日期?
    • 是:在本月 1 日运行,您将获得整个上个月和本月 1 日;从当月 1 日到今天的任何其他日期运行
    【解决方案5】:

    您可以通过以下策略轻松获得一个月的第一天:

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

    返回:

            FIRST_DAY
        1   01/02/2022
    

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多