请问Microsoft outlook 里面某年的第一周起始日期是怎么计算的?能给个算法吗? 谢谢.

解决方案 »

  1.   

    :) 心中的CPU不够, 算不出来.
      

  2.   

    如果一周的第一天设定为周日
    如下计算的是某一年的第一个周一是多少号declare @cyear varchar (100)
    set @cyear='2007-01-01'select dateadd(dd,8,dateadd(dd,-datepart(dw,@cyear),@cyear))
    ,datepart(ww,@cyear)
      

  3.   

    我指的是Microsoft outlook 里面某年的第一周起始日期的计算方法,假如outlook的周起始设定为星期一.
    2008年的第一周却是从2007年的12月31号开始的, (参见outlook的日历)
    所以现在想知道里面某年的第一周起始日期是不是有一定的方法?
      

  4.   

    明白你的意思了
    dateadd(dd,-datepart(dw,'2008')+2,'2008')以下是测试用例和代码2007年-2019年,假如outlook的周起始设定为星期一.
    测试结果如下
    ----------------------------------------
    2007: 2007-01-01
    2008: 2007-12-31
    2009: 2008-12-29
    2010: 2009-12-28
    2011: 2010-12-27
    2012: 2012-01-02
    2013: 2012-12-31
    2014: 2013-12-30
    2015: 2014-12-29
    2016: 2015-12-28
    2017: 2017-01-02
    2018: 2018-01-01
    2019: 2018-12-31
    -----------------------------------declare @cyear varchar (100)
    set @cyear='2007'
    declare @theyear int;
    set @theyear =convert(int,@cyear)
    while @theyear<2020
    beginset @cyear=convert(varchar(100),@theyear)
    print @cyear + ': ' +convert(varchar(10),dateadd(dd,-datepart(dw,@cyear)+2,@cyear),120);
    set @theyear=@theyear+1
    end
      

  5.   

    vieri_ch(尘雨-自在飞花轻似梦,无边丝雨细如愁):
    请问你的算法是?
    从你的测试数据来看, 从2007 -- 2011 都是对的, 但是2012年的第一个星期是从2011-12-26日开始的(outlook),  跟你的测得的2012: 2012-01-02 有出入, 可否说一下你的算法, 谢了. :)
      

  6.   

    我先按照规则修正算法,再给你讲述算法
    set datefirst 1 --设置数据库系统的一周的第一天是星期一
    dateadd(dd,-datepart(dw,'2008')+1,'2008') 测试结果
    2007: 2007-01-01
    2008: 2007-12-31
    2009: 2008-12-29
    2010: 2009-12-28
    2011: 2010-12-27
    2012: 2011-12-26
    2013: 2012-12-31
    2014: 2013-12-30
    2015: 2014-12-29
    2016: 2015-12-28
    2017: 2016-12-26
    2018: 2018-01-01
    2019: 2018-12-31SET DATEFIRST 1
    DECLARE @CYEAR VARCHAR (100)
    SET @CYEAR='2007'
    DECLARE @THEYEAR INT;
    SET @THEYEAR =CONVERT(INT,@CYEAR)
    WHILE @THEYEAR<2020
    BEGIN
        SET @CYEAR=CONVERT(VARCHAR(100),@THEYEAR)
        PRINT @CYEAR + ': ' +CONVERT(VARCHAR(10),DATEADD(DD,-DATEPART(DW,@CYEAR)+1,@CYEAR),120);
        SET @THEYEAR=@THEYEAR+1
    END
      

  7.   

    我把你的算法规则,用我的说法就是,
    先找到每年一月一日是星期几,
    接着找到那个星期的星期一,
    这个一月一日的日期减去星期数字就可以得到星期一是几月几号。理论上你的要求,不可能持出现当年第一周的星期一是比一月一日还晚sql server默认星期日为周的第一天,这个设置会影响到datepart(dw,'某年的一月一日')返回值set datefirst 1 --周一为第一天
    select datepart(dw,'2012')
    返回7
    星期  数字
    1     星期一
    2     星期二
    3     星期三
    4     星期四
    5     星期五
    6     星期六
    7     星期日set datefirst 7 --周日为第一天
    select datepart(dw,'2012')
    返回1
    星期  数字
    1     星期日
    2     星期一
    3     星期二
    4     星期三
    5     星期四
    6     星期五
    7     星期六要得到一月一日是星期几datepart(dw,'2012')我们看到是星期日
    如果星期一是第一天,他的值是7,那么该周星期一,应该用一月一日减去6天得到-7+1
    dateadd(dd,-7+1,'2012')='2011-12-26'
    完整的写法就是dateadd(dd,-datepart(dw,'2012')+1,'2012')如果星期日是第一天,他的值是1,那么该周星期一,应该用一月一日减去0天得到-1+1
    如果某年的一月一号是星期几,那么减去星期数字,再加上一个修正数字1就得到该周的星期一
    dateadd(dd,-1+1,'2012')='2012-01-01'完整的写法就是dateadd(dd,-datepart(dw,'2012')+1,'2012')
      

  8.   

    公式每年的第一天减去每年第一天的星期数字得到第一周的星期一是某年某月某日简单来说就是这样,只是因为周日,周一的问题,所以要首先设置
    set datefirst n
    然后再加上一个修正数字就可以了
      

  9.   

    谢谢vieri_ch详细的讲解. :)