没有DATEFIRST的SQL Week of Month

时间:2015-08-10 09:02:49

标签: sql-server tsql

我正在使用日期,因此我创建了一个生成SQL表日历的函数,该日历返回Day,Month,WeekOfMonth,WeekOfYear等。 现在,对于Day of Month字段,我使用以下函数:

    -- [WkNo]=Week number                                
    [WkNo]      = DATEPART(week,dt.DT),

但问题是,当我在安装了Language = US English的SQL上运行时,周设置错误,因为周从星期日开始。 我需要设置从星期一开始的一周,是否可以不使用DATEPART?

2 个答案:

答案 0 :(得分:2)

更新:根据提问者的评论,他无法使用DATEFIRST方法我正在更新答案。

注意:

这个答案本质上是通用的。

如果您希望星期二从星期二开始,而不是星期一,则可以将dateadd(dd,-1,dt.DT)更改为dateadd(dd,-2,dt.DT),将星期三更改为dateadd(dd,-3,dt.DT)

对于 1 (星期一)到 6 (星期六)的 n 值,基本上公式变为dateadd(dd,-n,dt.DT)。< / p>

SELECT  [WkNo]=
 ISNULL(DATEPART(week,
                      case 
                         when Year(dt.DT)>YEAR(dateadd(dd,-1,dt.DT)) 
                         then null  
                         else dateadd(dd,-1,dt.DT) 
                      end
                 ),1) 

请参阅工作小提琴http://sqlfiddle.com/#!6/10a80/14

旧答案: 请参阅MSDN文档:https://msdn.microsoft.com/en-us/library/ms174420.aspx

  

当datepart是星期(wk,ww)或工作日(dw)时,返回值   取决于使用SET DATEFIRST设置的值。 1月1日   任何年份定义星期datepart的起始编号   例如:DATEPART(周刊,&#39; 1月1日,xxxx&#39;)= 1,其中xxxx是任何一年。

    SET DATEFIRST 1
 -- [WkNo]=Week number                                
    [WkNo]      = DATEPART(week,dt.DT),

答案 1 :(得分:0)

<ui-select-choices ng-repeat="baseCurrency in baseCurrencies track by baseCurrency.flagCode | searchFilter:{name:$select.search}" >

您的查询:

SET DATEFIRST {1,2,3,4,5,6,7(default, U.S. English)}

请参阅Here