1

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

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

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

4

5 回答 5

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()))
于 2018-01-11T16:23:50.787 回答
1

您可以使用以下关于您的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') 

演示 1

即使 day_id 是数字格式(不是字符串),上面的 sql 也可以工作,为此您可以查看:

演示 2

于 2018-01-11T16:24:06.353 回答
1

在 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的 s 是八位数字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 提供的日期时间数据类型。正如您所看到的,使用这些数据类型的查询比其他可能性更容易阅读,并向您的橡皮鸭解释。

于 2018-01-11T16:32:29.640 回答
1

要获得当月的第一天,如果您想要前一个月的数据(如果在当月的第一天运行),您可以简单地将第一天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' ));

编辑:

转身<拿到<=今天。

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

于 2018-01-12T09:59:40.190 回答
0

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

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

返回:

        FIRST_DAY
    1   01/02/2022
于 2022-02-02T13:55:48.380 回答