语句是select DatePart(ww,getdate())
默认一年第一周是1月1日所在周,我想取第一个FullWeek为第一周,该怎么设置?
网上查到DatePart(interval, date[,firstdayofweek[, firstweekofyear]]) 
但是一直报错用不了。
求助啊!%>_<%

解决方案 »

  1.   


    举例子就是
    select DatePart(ww,'2013-1-6')
    这句执行的结果是2,我想得到1。
      

  2.   

    select DatePart(ww,'2013-1-6')-1
    这样?
      

  3.   


    那如果是2012年呢?
    每一年的起始周不一样。
    我想设置成每年第一个周都是整周。
    不知道我有没有表达清楚。select DatePart(ww,'2013-1-1')得到的结果是1,但是在我的观念里他应该是53(属于去年最后一周)。
      

  4.   


    我觉得你应该是明白了,有办法吗?
    http://baike.baidu.com/view/327452.htm
    这里面给的语法不能用啊。
      

  5.   

    select ceiling(cast(DateName (Dy,'2013-1-21') as INT)/7.0)
      

  6.   

    declare @d datetime = '2013-01-06'
    select datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)
      

  7.   


    System.Globalization.Calendar cal = new System.Globalization.CultureInfo("zh-CN").Calendar;
    int week =  cal.GetWeekOfYear(countDay, System.Globalization.CalendarWeekRule.FirstFullWeek, System.DayOfWeek.Sunday);贴段C#吧。里面的week就是我想得到的结果,规则能看的很清楚。
    我现在是想用sql里面的datepart得到这个结果,但是sql中间那个参数不是FirstFullWeek.
      

  8.   

    declare @d datetime = '2013-01-01'
    --declare @d datetime = '2013-01-06'declare @week int = datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)
    if (@week=0)
    begin
    set @d -= datepart(dayofyear,@d)
    set @week = datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)
    end
    select @week
      

  9.   

    declare @date date
    set @date='2013-1-5'
    select CONVERT(varchar(10),@date,23)+'为第'+cast(case when DATEPART(dw,cast(YEAR(@date) as CHAR(4))+'-1-1')<>1 then (case when DatePart(ww,@date)-1=0 then 53 else DatePart(ww,@date)-1 end) else DatePart(ww,@date) end as varchar(2))+'周'
      

  10.   

    把楼上的date 改为datetime ,楼主写的是对的。真牛叉
      

  11.   

    08的话支持date ,05需要改成datetime
      

  12.   

    when DatePart(ww,@date)-1=0 then 53这个太想当然了,有可能是52的,2011-01-01就是52。
      

  13.   

    那还不简单 接着修改:
    declare @date date
     set @date='2013-1-5'
     select CONVERT(varchar(10),@date,23)+'为第'+cast(case when DATEPART(dw,cast(YEAR(@date) as CHAR(4))+'-1-1')<>1 then (case when DatePart(ww,@date)-1=0 then (DATEPART(dw,cast(YEAR(@date)-1 as CHAR(4))+'-12-31')) else DatePart(ww,@date)-1 end) else DatePart(ww,@date) end as varchar(2))+'周' 
    这次应该是终极版了,多谢楼上提醒。
      

  14.   

    终极版又是想当然,按一下F5先吧。楼主的意思是非完整周归于上一年最后一周,每年从完整周开始计数。declare @d datetime = '2011-01-01', @week int
    select @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,datename(year,@d))-1)
    select @week
      

  15.   

    看来只能自己拼sql计算吗?
    难道sql server没有默认属性可以设置么?
    用set DateFirst 1可以设置一周的第一天为周几,为什么没有类似FirstWeekOfYear这种属性。
      

  16.   

    实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。
    请参考我的博客
    http://blog.csdn.net/tanleittl/article/details/7933693
      

  17.   


    你要用ISOWEEK,为什么不直接
    select DATEPART(ISOWK,'2012-12-31')?我要的也不是ISOWEEK,是每年的第一个周日所在周为第一周,每周第一天是星期天。
      

  18.   

    这个估计比较困难,sql中都是按照isoweek来处理的,sql中没有直接设置第一周的方法。需要自己去写函数
      

  19.   


    declare @date datetime,@yearFirstDay datetime,@lastYearDay datetime
    set @date='2012-1-1' --要计算其周次的日期
    set @yearFirstDay=cast(DATEPART(year,@date) as CHAR(4))+'-1-1' --该年的1月1日
    set @lastYearDay = cast(DATEPART(year,@date)-1 as CHAR(4))+'-12-31' --去年的12月31日select 
    case 
    when DATEDIFF(WK,@yearFirstDay,@date) = 0 --如果正好是1月1日所在周,用去年最后一周的周次(一般是53)
    and DATEPART(DW,@yearFirstDay) > 1 --判断这一年的1月1号是不是周日(1表示周日,2表示周一)
    then DATEPART(WK,@lastYearDay+'-12-31')--53when DATEDIFF(WK,@yearFirstDay,@date) = 0 --如果是1月1号所在周
    and DATEPART(DW,@yearFirstDay) = 1 --1月1日正好是周日,则为第一周
    then 1 --第一周when DATEDIFF(WK,@yearFirstDay,@date) > 0 --如果不是1月1号所在周
    and DATEPART(DW,@yearFirstDay) = 1 --1月1日正好是周日,则为第一周
    then DATEDIFF(WK,@yearFirstDay,@date)+1else DATEDIFF(WK,@yearFirstDay,@date) --如果是,则1月1号所在周为第一周
    end as week --否则,1月1号属于去年最后一周我写了段实现了我的需求,看起来有点复杂,我相信没多少人看得进去,因为我自己都不愿意看这么复杂的代码的。
    之所以没用大家建议的,是因为我不想写存储过程,我写的这个可以直接作为字段用。
    写的时候我也觉得这需求太蹩脚了,为什么不能直接用isoweek,但是没办法,之前统计数据库的时候都是用的这个规则,也不能因为我一个人的想法而改变。
    我觉得之前之所以会用这一套,是因为在c#里面可以直接指定规则,太方便了,所以没人考虑sql server该怎么办,反正用代码。忽然感觉好悲伤好无力!自己不想绕道用c#写同步程序,结果又不能自如的运用sql server。
    所以希望大家以后写程序用什么规则的时候一定要谨慎考虑啊T_T。
      

  20.   

    这个问题用有那么纠结吗。then DATEPART(WK,@lastYearDay+'-12-31')--53
    凭这句可以明确告诉你,你写的是错的,也是想当然lastYear一定是完整周开始的。既然不采用别人的建议,我也懒得跟你说我的思路。
      

  21.   

    不是一个意思么,1月1号不是周日,该周是不是跨年了?不是非完整周是什么周。“肯定是跟去年12月31日同属于一周的”,用你的代码算算20110101和20101231是不是返回相同的周。按你的思路,还要多一个lastLastYear才能算出去年12月31日,不多说了。
      

  22.   


    嗯,这个比我的简单好多好多,但是我是想直接用在字段中,就是select表的时候就能直接得出结果。
      

  23.   

    select DATEPART(ISOWK,'2012-12-31') 这样的写法在2008以后才可使用
    而且,周开始日为周一,与你要的周日不符
      

  24.   

    以下是为了回答你在我博客的评论
    规定就是规定,是为了统一标准而大家约定的规范,如果ISO周的定义就是:年份Y的第一周是Y年1月4号所在的周。我如何能够解释呢
    就拿2013年来说,1月4号是属于2012年的最后一周。
    你这句话,就已经遵循了某一准则
    例如:你这里提出的 1月7号所在的周就是第一周,而每一周的第一天是星期天。你的概念似乎非常的混淆