我写下面的查询工作正常,并且每隔一周获取一次数据。
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
答案 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')
即使day_id是数字格式(不是字符串),上面的sql也可以,为此您可以看一下:
答案 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
语句。