如果一个月SQL中的开始日期是“星期一”,如何从日期中提取“星期数”和“天数”

时间:2019-05-19 08:03:02

标签: sql sql-server datetime

我要从日期中提取以下内容:

周数 天数

我周的开始日期是星期一。

例如日期为:'2019年5月1日'或'2019-05-01'

然后

周数= 1 天数= 3

因为这一天是2019年5月1日,星期三。

我正在使用MS SQL Server 2012。 并使用以下来自net的代码获取周号。 我从中得到了周数,但我不知道它实际上在做什么。

function myFunction() {
  var ptrn = new RegExp("u?", "gim");

  var match;
  var i = 0;

  while ((match = ptrn.exec("color colour")) != null) {
    console.log(JSON.stringify(match));
    if (match.index == ptrn.lastIndex) {
      ptrn.lastIndex++;
    }

  }

}
myFunction()

任何人都可以向我解释一下,并告诉我如何提取天数。

5 个答案:

答案 0 :(得分:0)

此选择将为您提供@date 星期几(1:星期一,7:星期日),而不管您的@@ DATEFIRST集MS Doc

select (DATEPART(DW, @date) + @@DATEFIRST + 5) % 7 + 1 as [Day of Week]

答案 1 :(得分:0)

如果您设置datefirst,则只需执行以下操作:

set datefirst 1;  -- "1" = "Monday"

select datepart(week, getdate()), datepart(weekday, getdate())

答案 2 :(得分:0)

其他人提到了如何获取星期几。

关于获取每周的代码:

select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1

在我看来,似乎可以得到从零日到当前日期之间经过的整月数,这给了我们一个月序列号。

然后向该数字添加零个月(显然​​是用来将月份序列转换回代表当前月份开始的日期),从而为我们提供了月份开始的日期。

然后它获取从零天到月初的日期之间经过的整周数,从而为我们提供了一个星期序列号。

然后,将周序号回播到代表周初日期的日期,该日期代表月初日期之前或之前的星期一。

然后它获得上周一或先前日期与当前日期之前的日期之间的差(以周为单位),并将其相加1(以使该月的第一周表示为第1周)。 / p>

这听起来像是一个合理的算法,但是如果不测试和检查中间值,或者除非您从权威来源找到它,否则我不会认可它。

答案 3 :(得分:0)

检查此-

SELECT ISNULL(NULLIF(DATEPART(DW,GETDATE())-1,0),7)

答案 4 :(得分:0)

我已根据您的需要构造了查询。很好。

  

注意:将周日视为一周的第一天,将周六视为一周的第七天

DECLARE @dt datetime='2019-05-01'
DECLARE @Weekday INT

if(((DATEPART(DW, @dt) + @@DATEFIRST + 5) % 7 +2) =8)
    SET @Weekday =1 
else 
    SET @Weekday = ((DATEPART(DW, @dt) + @@DATEFIRST + 5) % 7 +2)

select DATEPART(week, @dt)- DATEPART(week, CONVERT(CHAR(6), @dt, 112)+'01')+ 1 AS [Week Number], @Weekday AS [Day of Week]