十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1、首先可以直接用datepart函数,第一个参数设置成weekday就可以了。
在西峡等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、成都网站制作 网站设计制作定制网站建设,公司网站建设,企业网站建设,品牌网站制作,成都全网营销,成都外贸网站制作,西峡网站建设费用合理。
2、得到的结果是这一天是这周的第几天,注意星期日是第一天。
3、可以看到去掉星期日就是日期的星期几了。
4、然后在实际使用的时候就可以直接减去1就可以了。
5、另外datepart第二个参数也可以直接放getdate。
6、最后得到的结果也是需要的日期。
最近遇到业务需求,需要按周统计数据。
思考再三想到可以使用每周周一来计算。
故写出如下获得系统当前月份所有周一的语句。
select * from (
--转化成周一去重
select distinct trunc(t.day,'iw') as mon from (
--获取本月所有日期集合
SELECT trunc(sysdate, 'mm') + LEVEL - 1 DAY
FROM DUAL
CONNECT BY trunc(sysdate, 'mm') + LEVEL - 1 =
last_day(trunc(sysdate))
)t
)a
--移除非本月的周一
where trunc(a.mon, 'mm') = trunc(sysdate, 'mm')
ORDER BY MON
注:
trunc(sysdate,'iw') 语句可以获取本周周一的日期 (date类型)
trunc(sysdate,'iw') +1 可以获取本周周二的日期。
以此类推
(可以把sysdate换成其它时间)
--1、取某天在本周中的第几天(默认周日开始算第1天)
select to_char(to_date('2011-04-11','yyyy-mm-dd'), 'd') from dual;
--2、如果要从周一开始算第1天,需要做一些手脚
--大概思路是:1变成7,2变成1,3变成2......,7变成6
select decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1)
from dual;
--3、再根据上面的结论倒推到上周时间
select to_date('2011-04-04', 'yyyy-mm-dd') -
decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1) - 7 + 1,
to_date('2011-04-04', 'yyyy-mm-dd') -
decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1) - 7 + 1 + 6
from dual;
SQL select
2 CASE
3 WHEN TO_CHAR(to_date('201207','yyyymm'), 'D') = '1'
4 THEN to_date('201207','yyyymm')
5 ELSE
6 next_day(to_date('201207','yyyymm'),'星期日')
7 END AS "第一个星期日"
8 from
9 dual;
第一个星期
----------
2012-07-01
SQL
SQL select
2 CASE
3 WHEN TO_CHAR(to_date('201208','yyyymm'), 'D') = '1'
4 THEN to_date('201208','yyyymm')
5 ELSE
6 next_day(to_date('201208','yyyymm'),'星期日')
7 END AS "第一个星期日"
8 from
9 dual;
第一个星期
----------
2012-08-05
CASE WHEN 主要为了解决 当月1号, 刚好是星期日的 特殊情况!!!
select b.day,b.dd,sum(b.flag) over(partition by b.dd) as dd_sum
from
(select a.day,to_char(a.day,'day') as dd, 1 as flag
from
(SELECT TO_DATE('20130118', 'YYYY-MM-DD') + LEVEL - 1 DAY
FROM DUAL
CONNECT BY TO_DATE('20130118', 'YYYY-MM-DD') + LEVEL - 1 =
TO_DATE('20130209', 'YYYY-MM-DD')
) a
) b
group by b.day