在 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')
即使 day_id 是数字格式(不是字符串),上面的 sql 也可以,为此你可以看看这个:
在 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
我在下面写了查询,它工作正常,并且它在前一周每次都获取数据。
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')
即使 day_id 是数字格式(不是字符串),上面的 sql 也可以,为此你可以看看这个:
在 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