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

时间:2018-01-11 16:12:03

标签: sql oracle datetime date-comparison sysdate

我写下面的查询工作正常,并且每隔一周获取一次数据。

    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月1日开始直到sysdate。因此,例如,如果我现在运行此查询,我应该从2018年1月1日到2018年1月11日获得数据。

如果我在1号Febrauary运行此查询,那么它将返回1月整月的数据。我不确定是否可以在单个查询中执行。

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

4 个答案:

答案 0 :(得分: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()))

答案 1 :(得分: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') 

D e m o 1

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

D e m o 2

答案 2 :(得分: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似乎是八位数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

答案 3 :(得分: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语句。