首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL怎么算出一年中有多少周及每周的日期段,设周末为第一天

2012-03-20 
SQL如何算出一年中有多少周及每周的日期段,设周末为第一天请教大家:周别定义自周日 ~ 周六 例如:2012年第

SQL如何算出一年中有多少周及每周的日期段,设周末为第一天
请教大家:
   
  周别定义 自周日 ~ 周六 例如: 2012年第一周 01/01~01/07天数为 7天,以此类推;

  想得出的结果如:

  年份 周别 日期范围
  2012 1 2012/01/01~2012/01/07
  .
  . 
  .


  先谢谢了!

[解决办法]

SQL code
;with ach as(    select dateadd(dd,number,cast(ltrim(year(getdate()))+'-01-01' as datetime)) date    from master..spt_values    where [type] = 'p' and number between 0 and 400),cte as(    select *    from ach    where year(date) = year(getdate()))select datepart(wk,date) as wk,min(date) mindate,max(date) maxdatefrom ctegroup by datepart(wk,date)/********************wk          mindate                 maxdate----------- ----------------------- -----------------------1           2012-01-01 00:00:00.000 2012-01-07 00:00:00.0002           2012-01-08 00:00:00.000 2012-01-14 00:00:00.0003           2012-01-15 00:00:00.000 2012-01-21 00:00:00.0004           2012-01-22 00:00:00.000 2012-01-28 00:00:00.0005           2012-01-29 00:00:00.000 2012-02-04 00:00:00.0006           2012-02-05 00:00:00.000 2012-02-11 00:00:00.0007           2012-02-12 00:00:00.000 2012-02-18 00:00:00.0008           2012-02-19 00:00:00.000 2012-02-25 00:00:00.0009           2012-02-26 00:00:00.000 2012-03-03 00:00:00.00010          2012-03-04 00:00:00.000 2012-03-10 00:00:00.00011          2012-03-11 00:00:00.000 2012-03-17 00:00:00.00012          2012-03-18 00:00:00.000 2012-03-24 00:00:00.00013          2012-03-25 00:00:00.000 2012-03-31 00:00:00.00014          2012-04-01 00:00:00.000 2012-04-07 00:00:00.00015          2012-04-08 00:00:00.000 2012-04-14 00:00:00.00016          2012-04-15 00:00:00.000 2012-04-21 00:00:00.00017          2012-04-22 00:00:00.000 2012-04-28 00:00:00.00018          2012-04-29 00:00:00.000 2012-05-05 00:00:00.00019          2012-05-06 00:00:00.000 2012-05-12 00:00:00.000...
[解决办法]
有函数的,自己拿去改一下


SQL季度函数
 SELECT DATEPART(quarter,GETDATE()) --获取当前季度 

这个季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

上个季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate())-1, 0)

上上个季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate())-2, 0)

上上上个季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate())-3, 0)

......

n个季度前的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate())-n, 0)

这个季度的最后一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate())+1, -1)

上个季度的最后一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), -1)

上上个季度的最后一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate())-1, -1)

n个季度前的最后一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate())-n+1, -1)

一个月第一天的SQL 脚本:
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

当天的半夜
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

上个月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))


去年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

本月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

本年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。



本月的第一个星期一
select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)
[解决办法]

SQL code
declare @a datetime ='2011-01-01', @b datetime ='2012-01-01'select * from(select '2011' as [年], number/7+1 as [周],convert(varchar(10),dateadd(dd,number/7,@a),120)+'~'+convert(varchar(10),dateadd(dd,number/7+7,@a),120) as [范围]from master..spt_values where type='p' and number<datediff(dd,@a,@b)) tgroup by [年],周,[范围]/*年    周           范围---- ----------- ---------------------2011 1           2011-01-01~2011-01-082011 2           2011-01-02~2011-01-092011 3           2011-01-03~2011-01-102011 4           2011-01-04~2011-01-112011 5           2011-01-05~2011-01-122011 6           2011-01-06~2011-01-132011 7           2011-01-07~2011-01-142011 8           2011-01-08~2011-01-152011 9           2011-01-09~2011-01-162011 10          2011-01-10~2011-01-172011 11          2011-01-11~2011-01-182011 12          2011-01-12~2011-01-192011 13          2011-01-13~2011-01-202011 14          2011-01-14~2011-01-212011 15          2011-01-15~2011-01-222011 16          2011-01-16~2011-01-232011 17          2011-01-17~2011-01-242011 18          2011-01-18~2011-01-252011 19          2011-01-19~2011-01-262011 20          2011-01-20~2011-01-272011 21          2011-01-21~2011-01-282011 22          2011-01-22~2011-01-292011 23          2011-01-23~2011-01-302011 24          2011-01-24~2011-01-312011 25          2011-01-25~2011-02-012011 26          2011-01-26~2011-02-022011 27          2011-01-27~2011-02-032011 28          2011-01-28~2011-02-042011 29          2011-01-29~2011-02-052011 30          2011-01-30~2011-02-062011 31          2011-01-31~2011-02-072011 32          2011-02-01~2011-02-082011 33          2011-02-02~2011-02-092011 34          2011-02-03~2011-02-102011 35          2011-02-04~2011-02-112011 36          2011-02-05~2011-02-122011 37          2011-02-06~2011-02-132011 38          2011-02-07~2011-02-142011 39          2011-02-08~2011-02-152011 40          2011-02-09~2011-02-162011 41          2011-02-10~2011-02-172011 42          2011-02-11~2011-02-182011 43          2011-02-12~2011-02-192011 44          2011-02-13~2011-02-202011 45          2011-02-14~2011-02-212011 46          2011-02-15~2011-02-222011 47          2011-02-16~2011-02-232011 48          2011-02-17~2011-02-242011 49          2011-02-18~2011-02-252011 50          2011-02-19~2011-02-262011 51          2011-02-20~2011-02-272011 52          2011-02-21~2011-02-282011 53          2011-02-22~2011-03-01(53 行受影响)*/
[解决办法]
5楼还是错啊
[解决办法]
SQL code
declare @d dateselect @d='2012-01-01';with t as(select dateadd(d,number,@d) dfrom master.dbo.spt_valueswhere [type]='P' and number<datediff(d,@d,dateadd(yy,1,@d)))select datepart(yy,d) '年份', datepart(week,d) '周别',convert(varchar,min(d),111)+'~'+convert(varchar,max(d),111) '日期范围'from tgroup by datepart(yy,d),datepart(week,d) 年份          周别          日期范围----------- ----------- -----------------------2012        1           2012/01/01~2012/01/072012        2           2012/01/08~2012/01/142012        3           2012/01/15~2012/01/212012        4           2012/01/22~2012/01/282012        5           2012/01/29~2012/02/042012        6           2012/02/05~2012/02/112012        7           2012/02/12~2012/02/182012        8           2012/02/19~2012/02/252012        9           2012/02/26~2012/03/032012        10          2012/03/04~2012/03/102012        11          2012/03/11~2012/03/172012        12          2012/03/18~2012/03/242012        13          2012/03/25~2012/03/312012        14          2012/04/01~2012/04/072012        15          2012/04/08~2012/04/142012        16          2012/04/15~2012/04/212012        17          2012/04/22~2012/04/282012        18          2012/04/29~2012/05/052012        19          2012/05/06~2012/05/122012        20          2012/05/13~2012/05/192012        21          2012/05/20~2012/05/262012        22          2012/05/27~2012/06/022012        23          2012/06/03~2012/06/092012        24          2012/06/10~2012/06/162012        25          2012/06/17~2012/06/232012        26          2012/06/24~2012/06/302012        27          2012/07/01~2012/07/072012        28          2012/07/08~2012/07/142012        29          2012/07/15~2012/07/212012        30          2012/07/22~2012/07/282012        31          2012/07/29~2012/08/042012        32          2012/08/05~2012/08/112012        33          2012/08/12~2012/08/182012        34          2012/08/19~2012/08/252012        35          2012/08/26~2012/09/012012        36          2012/09/02~2012/09/082012        37          2012/09/09~2012/09/152012        38          2012/09/16~2012/09/222012        39          2012/09/23~2012/09/292012        40          2012/09/30~2012/10/062012        41          2012/10/07~2012/10/132012        42          2012/10/14~2012/10/202012        43          2012/10/21~2012/10/272012        44          2012/10/28~2012/11/032012        45          2012/11/04~2012/11/102012        46          2012/11/11~2012/11/172012        47          2012/11/18~2012/11/242012        48          2012/11/25~2012/12/012012        49          2012/12/02~2012/12/082012        50          2012/12/09~2012/12/152012        51          2012/12/16~2012/12/222012        52          2012/12/23~2012/12/292012        53          2012/12/30~2012/12/31(53 row(s) affected) 


[解决办法]

SQL code
select number+1 as wknum,dateadd(wk,number,'2012-01-01') as firstday,(case when year(dateadd(d,-1,dateadd(wk,number+1,'2012-01-01')))>2012 then '2012-12-31' else dateadd(d,-1,dateadd(wk,number+1,'2012-01-01')) end) as sevendayfrom master..spt_valueswhere type='p' and year(dateadd(wk,number,'2012-01-01'))=2012/*wknum       firstday                sevenday----------- ----------------------- -----------------------1           2012-01-01 00:00:00.000 2012-01-07 00:00:00.0002           2012-01-08 00:00:00.000 2012-01-14 00:00:00.0003           2012-01-15 00:00:00.000 2012-01-21 00:00:00.0004           2012-01-22 00:00:00.000 2012-01-28 00:00:00.0005           2012-01-29 00:00:00.000 2012-02-04 00:00:00.0006           2012-02-05 00:00:00.000 2012-02-11 00:00:00.0007           2012-02-12 00:00:00.000 2012-02-18 00:00:00.0008           2012-02-19 00:00:00.000 2012-02-25 00:00:00.0009           2012-02-26 00:00:00.000 2012-03-03 00:00:00.00010          2012-03-04 00:00:00.000 2012-03-10 00:00:00.00011          2012-03-11 00:00:00.000 2012-03-17 00:00:00.00012          2012-03-18 00:00:00.000 2012-03-24 00:00:00.00013          2012-03-25 00:00:00.000 2012-03-31 00:00:00.00014          2012-04-01 00:00:00.000 2012-04-07 00:00:00.00015          2012-04-08 00:00:00.000 2012-04-14 00:00:00.00016          2012-04-15 00:00:00.000 2012-04-21 00:00:00.00017          2012-04-22 00:00:00.000 2012-04-28 00:00:00.00018          2012-04-29 00:00:00.000 2012-05-05 00:00:00.00019          2012-05-06 00:00:00.000 2012-05-12 00:00:00.00020          2012-05-13 00:00:00.000 2012-05-19 00:00:00.00021          2012-05-20 00:00:00.000 2012-05-26 00:00:00.00022          2012-05-27 00:00:00.000 2012-06-02 00:00:00.00023          2012-06-03 00:00:00.000 2012-06-09 00:00:00.00024          2012-06-10 00:00:00.000 2012-06-16 00:00:00.00025          2012-06-17 00:00:00.000 2012-06-23 00:00:00.00026          2012-06-24 00:00:00.000 2012-06-30 00:00:00.00027          2012-07-01 00:00:00.000 2012-07-07 00:00:00.00028          2012-07-08 00:00:00.000 2012-07-14 00:00:00.00029          2012-07-15 00:00:00.000 2012-07-21 00:00:00.00030          2012-07-22 00:00:00.000 2012-07-28 00:00:00.00031          2012-07-29 00:00:00.000 2012-08-04 00:00:00.00032          2012-08-05 00:00:00.000 2012-08-11 00:00:00.00033          2012-08-12 00:00:00.000 2012-08-18 00:00:00.00034          2012-08-19 00:00:00.000 2012-08-25 00:00:00.00035          2012-08-26 00:00:00.000 2012-09-01 00:00:00.00036          2012-09-02 00:00:00.000 2012-09-08 00:00:00.00037          2012-09-09 00:00:00.000 2012-09-15 00:00:00.00038          2012-09-16 00:00:00.000 2012-09-22 00:00:00.00039          2012-09-23 00:00:00.000 2012-09-29 00:00:00.00040          2012-09-30 00:00:00.000 2012-10-06 00:00:00.00041          2012-10-07 00:00:00.000 2012-10-13 00:00:00.00042          2012-10-14 00:00:00.000 2012-10-20 00:00:00.00043          2012-10-21 00:00:00.000 2012-10-27 00:00:00.00044          2012-10-28 00:00:00.000 2012-11-03 00:00:00.00045          2012-11-04 00:00:00.000 2012-11-10 00:00:00.00046          2012-11-11 00:00:00.000 2012-11-17 00:00:00.00047          2012-11-18 00:00:00.000 2012-11-24 00:00:00.00048          2012-11-25 00:00:00.000 2012-12-01 00:00:00.00049          2012-12-02 00:00:00.000 2012-12-08 00:00:00.00050          2012-12-09 00:00:00.000 2012-12-15 00:00:00.00051          2012-12-16 00:00:00.000 2012-12-22 00:00:00.00052          2012-12-23 00:00:00.000 2012-12-29 00:00:00.00053          2012-12-30 00:00:00.000 2012-12-31 00:00:00.000(53 行受影响)*/
[解决办法]
SQL code
--本周第一天   SELECT DATEADD(Day,1-(DATEPART(Weekday,getdate())+@@DATEFIRST-1)%7,getdate())  --or   select dateadd(wk, datediff(wk,0,getdate()), 0)  --本周第一天   select dateadd(wk, datediff(wk,0,getdate()), 6)    --上月第一天   SELECT CONVERT(CHAR(10),DATEADD(month,-1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111)  --上月最后一天   SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()),0)),111)+' 23:59:59'  --本月第一天   select dateadd(dd,-datepart(dd,getdate())+1,getdate())  --本月最后一天   select dateadd(dd,-datepart(dd,getdate()) ,dateadd(mm,1,getdate()))  --本月天数   select datediff(dd,dateadd(dd,-datepart(dd,getdate())+1,getdate()), dateadd(dd,-datepart(dd,getdate())+1,dateadd(mm,1,getdate())))  --or   select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(getdate()) as varchar)+'-'+cast(month(getdate()) as varchar)+'-01' as datetime))))    --下月第一天   select dateadd(dd,-datepart(dd,getdate())+1,dateadd(mm,1,getdate()))  --下月最后一天   SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+2,0)),111)+' 23:59:59'  --季度第一天   SELECT   DATEADD(qq,   DATEDIFF(qq,0,getdate()),   0)   --季度最后一天(直接推算法)   SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1+DATEPART(Quarter,getdate())*3-Month(getdate()),getdate()),120)+'1')  --季度的最后一天(CASE判断法)   select DATEADD(Month,DATEPART(Quarter,getdate())*3-Month(getdate()),getdate())    --本月第一个星期一   SELECT DATEADD(wk, DATEDIFF(wk, '', DATEADD(dd, 6 - DAY(getdate()), getdate())), '')   --去年最后一天   SELECT   dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))   --今年第一天   SELECT   DATEADD(yy,   DATEDIFF(yy,0,getdate()),   0)   --今年最后一天   SELECT  dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1,0))    --指定日期所在周的任意一天   SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)--5.指定日期所在周的任意星期几   --A.  星期天做为一周的第1天   SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)  --B.  星期一做为一周的第1天   SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)  ---周内的第几日   select datepart(weekday,getdate()) as 周内的第几日  --年内的第几周   select datepart(week,getdate()) as 年内的第几周  --年内的第几季   select datepart(quarter,getdate()) as 年内的第几季      --判断某天是当月的第几周的sql函数    CREATE   FUNCTION   WeekOfMonth(@day datetime)     RETURNS int  AS   begin    ----declare @day datetime   declare @num int  declare @Start datetime  declare @dd int  declare @dayofweek char(8)  declare @dayofweek_num char(8)  declare @startWeekDays int  ---set @day='2009-07-05'   if datepart(dd,@day)=1  return 1  else  set @Start= (SELECT   DATEADD(mm,   DATEDIFF(mm,0,@day),   0)) --一个月第一天的   set @dayofweek= (datename(weekday,@Start)) ---得到本月第一天是周几   set @dayofweek_num=(select (case @dayofweek when '星期一' then 2  when '星期二' then 3  when '星期三' then 4  when '星期四' then 5  when '星期五' then 6  when '星期六' then 7  when '星期日' then 1  end))  set @dayofweek_num= 7-@dayofweek_num+1 ---得到本月的第一周一共有几天   ---print @dayofweek_num      set @dd=datepart(dd,@day) ----得到今天是这个月的第几天   --print @dd   if @dd<=@dayofweek_num --小于前一周的天数   return 1  else   set @dd=@dd-@dayofweek_num  if @dd % 7=0       begin         set @num=@dd / 7          return @num+1                end     else --if @dd % 7<>0             set @num=@dd / 7  set @num=@num+1+1         return @num  end 


[解决办法]
set datefirst 7--设置每周的起始日期为 周末(美国(数据库)默认)
;with ach as
(
select dateadd(dd,number,cast(ltrim(year(getdate()))+'-01-01' as datetime)) date
from master..spt_values
where [type] = 'p' and number between 0 and 400
),cte as
(
select *
from ach
where year(date) = year(getdate())
)

select top 10 datepart(wk,date) as wk,min(date) mindate,max(date) maxdate
from cte
group by datepart(wk,date)

热点排行
Bad Request.