oracle 转换一个日期时间对应的半年(上半年/下半年)的第一天和最后一天

供稿:hz-xin.com     日期:2024-05-04
如何获得Oracle当前日期的年或月的第一天和最后一天

1.当前日期的年份第一天和最后一天
第一天
select trunc(sysdate,'y') FROM DUAL;
select trunc(sysdate,'yy') FROM DUAL;
select trunc(sysdate,'yyy') FROM DUAL;
select trunc(sysdate,'yyyy') FROM DUAL;
最后一天
select last_day(add_months(trunc(SYSDATE,'y'),11)) from dual
2.当前日期的月份第一天和最后一天
select trunc(sysdate,'MM') from dual;
select last_day(sysdate) from dual;

这个就可以查出你web_date中指定某年某月第一天、最后一天的数据了:

但如果你的字段year_month是date类型的,就这样写:
select * from web_date a where a.year_month in
(select to_date('201502'||'01','yyyymmdd') from dual
union all(select to_date(to_char(last_day(to_date('201502', 'yyyymm')),'yyyymmdd'),'yyyymmdd')from dual));

但如果你的字段year_month是char类型的,就这样写:
select * from web_date a where a.year_month in
( select '201502'||'01' from dual
union all( select to_char(last_day(to_date('201502', 'yyyymm')),'yyyymmdd')from dual));

'201502'这个是变量,你可以任意更改。

试试下面语句:当天日期小于7月时取当年的第一天,当天日期大于6月时取7月的第一天。
select case when to_char(sysdate,'mm')<7 then trunc(sysdate,'YYYY') else
trunc(add_months(sysdate,-to_char(sysdate,'mm')+7),'mm') end from dual;

SELECT
CASE WHEN
MOD(EXTRACT(MONTH FROM TRUNC( SYSDATE, 'Q' )) , 2) = 1 THEN
TRUNC( SYSDATE, 'Q' )
ELSE
ADD_MONTHS( TRUNC( SYSDATE, 'Q' ), -3)
END
FROM
dual;

有点复杂

算法是:
判断 本季度第一天是几月, 月份是 奇数的 ( 1月 7 月), 那么 就是 要的结果了
如果月份是偶数的, 那么 在此基础上, 向前减少3月.

试试这样吧:
to_date(DECODE(to_char(sysdate,'yyyy-mm'),
'2012-01','2012-01-01',
'2012-02','2012-01-01',
'2012-03','2012-01-01',
'2012-04','2012-01-01',
'2012-05','2012-01-01',
'2012-06','2012-01-01',
'2012-07-01'
),'yyyy-mm-dd')

add_months(trunc(sysdate,'yyyy'),case when to_number(to_date(sysdate,'mm'))>6 then 6 else 0 end)