需要一些DateDiff计算从星期一开始的一周

时间:2018-04-10 20:18:45

标签: sql-server tsql

我有以下T-SQL。我试图用来计算一周开始的日期。我需要我的星期一周开始:

SET DATEFIRST 1 -- Monday (First Week day)

DECLARE @dt DATETIME2

SELECT DATEADD(week, (-1) * (datepart(dw, @dt) - 1), @dt) AS datetime2--(7)

DECLARE @SchDT Datetime
DECLARE @TstPeriod varchar(20)
SET @TstPeriod = 'Week'

IF @TstPeriod = 'Month'
    SET @SchDT = cast(DATEADD(Month, DATEDIFF(month,0,GETDATE()),-1) as datetime2(7))

IF @TstPeriod = 'Week'
    SET @SchDT = cast(DATEADD(week, DATEDIFF(week,0,GETDATE()),-1) as datetime2(7))

SELECT @SchDT

只有在此之后,我才意识到SQL Server认为本周的开始时间是星期日 - 无论如何。

有没有人遇到类似的需求,并且可以分享如何使用星期一作为一周的开始使SQL Server计算datediff()

非常感谢

3 个答案:

答案 0 :(得分:3)

您不应将SET DATEFIRST(或SET LANGUAGE)用于整批。这可能会产生各种意想不到的副作用。

@@DATEFIRST,将一周的第一天反映为INT值。使用它来计算您的值独立

- 您可以检查差异

SET LANGUAGE GERMAN;
SELECT @@DATEFIRST; 
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST; 

- 我设置了一个变量

DECLARE @d DATETIME=GETDATE();

- 像另一个答案中的建议这样的简单计算将根据系统的文化返回不同的日期

SET LANGUAGE GERMAN;
SELECT DATEADD(DAY,-DATEPART(WEEKDAY,@d)+2,@d);
SET LANGUAGE ENGLISH;
SELECT DATEADD(DAY,-DATEPART(WEEKDAY,@d)+2,@d);

- 但是使用@@DATEFIRST您可以在计算中获得更正字词

SET LANGUAGE GERMAN;
SELECT DATEADD(DAY,-((DATEPART(WEEKDAY,@d) + @@DATEFIRST + 5) % 7),@d);
SET LANGUAGE ENGLISH;
SELECT DATEADD(DAY,-((DATEPART(WEEKDAY,@d) + @@DATEFIRST + 5) % 7),@d);

答案 1 :(得分:2)

SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0)

应该在本周的星期一给你。

这相当于:

SELECT DATEADD(WEEK, DATEDIFF(WEEK, '1900-01-01', GETDATE()), '1900-01-01')

自1900年1月1日起,该星期一增加了几周,以便返回未来的星期一。

正如Shnugo指出的那样,如果getdate()返回一个星期日,这实际上将适用于下一个星期一。您可以使用函数来检查它的当天,并根据需要操作日期。

使用DATENAME的示例:

SELECT DATEADD(WEEK, DATEDIFF(WEEK, '1900-01-01', CASE WHEN DATENAME(WEEKDAY, GETDATE()) = 'Sunday' THEN DATEADD(DAY, -1, GETDATE()) ELSE GETDATE() END), '1900-01-01')

答案 2 :(得分:0)

这应该会让你知道你约会的那一周的星期一。

getValueInput (evt) {
  const inputValue = evt.target.value;
  this.setState({ input: inputValue });
  this.filterNames(inputValue);
}

filterNames (inputValue) {
  const { peoples } = this.state;
  this.setState({
    filtered: peoples.filter(item => 
       item.name.includes(inputValue)),
    currentPage:0
  });
}