Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算此周的日期范围_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 计算此周的日期范围

Sql 计算此周的日期范围,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想知道是否有一种方法,我可以计算这个星期的日期范围 比如说 Monday - 2016-11-21 Tuesday - 2016-11-22 Wednesday - 2016-11-23 等等等等 如果有人能在语法和计算方面帮助我,那就太好了 如果你对他们自己的专栏感到满意,那么你可以这样做 SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Last_Monday ,DATEADD(WEEK, DATEDIFF(WEEK, 2, G

我想知道是否有一种方法,我可以计算这个星期的日期范围

比如说

Monday -    2016-11-21
Tuesday -   2016-11-22
Wednesday - 2016-11-23
等等等等


如果有人能在语法和计算方面帮助我,那就太好了

如果你对他们自己的专栏感到满意,那么你可以这样做

SELECT
DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Last_Monday
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1) Last_Tuesday
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2) Last_Wednesday
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3) Last_Thursday
结果

Last_Monday             Last_Tuesday            Last_Wednesday          Last_Thursday
2016-11-14 00:00:00.000 2016-11-15 00:00:00.000 2016-11-16 00:00:00.000 2016-11-17 00:00:00.000
Date_Field                  Day_Name
2016-11-14 00:00:00.000     Last_Monday
2016-11-15 00:00:00.000     Last_Tuesday
2016-11-16 00:00:00.000     Last_Wednesday
2016-11-17 00:00:00.000     Last_Thursday
如果您需要它在行中,那么只需合并结果

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Date_Field, 'Last_Monday' Day_Name
UNION
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1), 'Last_Tuesday'
UNION
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2), 'Last_Wednesday'
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3), 'Last_Thursday'
结果

Last_Monday             Last_Tuesday            Last_Wednesday          Last_Thursday
2016-11-14 00:00:00.000 2016-11-15 00:00:00.000 2016-11-16 00:00:00.000 2016-11-17 00:00:00.000
Date_Field                  Day_Name
2016-11-14 00:00:00.000     Last_Monday
2016-11-15 00:00:00.000     Last_Tuesday
2016-11-16 00:00:00.000     Last_Wednesday
2016-11-17 00:00:00.000     Last_Thursday
在这里阅读一篇文章,很好地解释这是如何工作的


如果你在他们自己的专栏中对他们感到满意,那么你可以这样做

SELECT
DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Last_Monday
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1) Last_Tuesday
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2) Last_Wednesday
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3) Last_Thursday
结果

Last_Monday             Last_Tuesday            Last_Wednesday          Last_Thursday
2016-11-14 00:00:00.000 2016-11-15 00:00:00.000 2016-11-16 00:00:00.000 2016-11-17 00:00:00.000
Date_Field                  Day_Name
2016-11-14 00:00:00.000     Last_Monday
2016-11-15 00:00:00.000     Last_Tuesday
2016-11-16 00:00:00.000     Last_Wednesday
2016-11-17 00:00:00.000     Last_Thursday
如果您需要它在行中,那么只需合并结果

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Date_Field, 'Last_Monday' Day_Name
UNION
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1), 'Last_Tuesday'
UNION
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2), 'Last_Wednesday'
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3), 'Last_Thursday'
结果

Last_Monday             Last_Tuesday            Last_Wednesday          Last_Thursday
2016-11-14 00:00:00.000 2016-11-15 00:00:00.000 2016-11-16 00:00:00.000 2016-11-17 00:00:00.000
Date_Field                  Day_Name
2016-11-14 00:00:00.000     Last_Monday
2016-11-15 00:00:00.000     Last_Tuesday
2016-11-16 00:00:00.000     Last_Wednesday
2016-11-17 00:00:00.000     Last_Thursday
在这里阅读一篇文章,很好地解释这是如何工作的


您可以设置一周的开始和结束日期,并通过这些日期进行迭代:

Declare @startDay   datetime,
        @endDay     datetime,
        @iterDate   datetime

Set @startDay = dateadd(day, datediff(day, 0, getdate()) / 7 * 7, 0) --Starting day of this week
Set @endDay = dateadd(day, 7, @startDay)

Set @iterDate = @startDay

Declare @tmpResults Table (Date datetime, DayName varchar(20))

While (@iterDate < @endDay)

Begin
    Insert into @tmpResults (Date, DayName)
    Values (@iterDate, datename(weekday, @iterDate))

    Set @iterDate = dateadd(day, 1, @iterDate)
End

select Date, DayName From @tmpResults
结果:


您可以设置一周的开始和结束日期,并通过这些日期进行迭代:

Declare @startDay   datetime,
        @endDay     datetime,
        @iterDate   datetime

Set @startDay = dateadd(day, datediff(day, 0, getdate()) / 7 * 7, 0) --Starting day of this week
Set @endDay = dateadd(day, 7, @startDay)

Set @iterDate = @startDay

Declare @tmpResults Table (Date datetime, DayName varchar(20))

While (@iterDate < @endDay)

Begin
    Insert into @tmpResults (Date, DayName)
    Values (@iterDate, datename(weekday, @iterDate))

    Set @iterDate = dateadd(day, 1, @iterDate)
End

select Date, DayName From @tmpResults
结果:


请记住,一周的定义不止一个。根据你的需要,你可能想记住这一点。嗨,Jens,你到底是什么意思?如果我能避免未来的问题,我会想。根据地区的不同,一周的定义可能会有所改变。在一些地区,一周从周一开始,其他地区从周日开始。同样在一年中处理数周的情况下,这些实现可能会有所不同,尤其是在一年的开始和结束时。第一周不一定从1月1日开始,它甚至可能是去年一周的一部分。这是一个非常常见的BI问题。啊,我明白你的意思。幸运的是,这只是一份针对英国一个小型团队的报告,所以该地区的团队不会对此产生影响。然而,这一年的一部分。。。。这可能会引起一个问题,但我必须在一个半月后看看结果如何。谢谢你给Jens的建议。请记住一周的定义不止一个。根据你的需要,你可能想记住这一点。嗨,Jens,你到底是什么意思?如果我能避免未来的问题,我会想。根据地区的不同,一周的定义可能会有所改变。在一些地区,一周从周一开始,其他地区从周日开始。同样在一年中处理数周的情况下,这些实现可能会有所不同,尤其是在一年的开始和结束时。第一周不一定从1月1日开始,它甚至可能是去年一周的一部分。这是一个非常常见的BI问题。啊,我明白你的意思。幸运的是,这只是一份针对英国一个小型团队的报告,所以该地区的团队不会对此产生影响。然而,这一年的一部分。。。。这可能会引起一个问题,但我必须在一个半月后看看结果如何。谢谢你的建议,简。嗨,里奇,这是个不错的选择。我可以用它来满足我的需要。听起来可能是个愚蠢的问题。。。。。。但是你能不能把它分解一下,这样我就能理解为什么这样做有效了?我刚刚链接到一篇文章,很好地解释了这一点,如果这对你来说还不清楚,请告诉我。嗨,里奇,这是一个正确的做法。我可以用它来满足我的需要。听起来可能是个愚蠢的问题。。。。。。但是你能不能把它分解一下,这样我就可以理解为什么这样做有效了?我刚刚链接到一篇文章,对它进行了很好的解释,如果这对你来说还不清楚,请告诉我。虽然这个代码片段可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高你文章的质量。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请编辑您的答案以添加解释,并说明适用的限制和假设。虽然此代码片段可能会解决此问题,但如何以及为什么解决此问题将真正有助于提高您的文章质量。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请编辑您的答案以添加解释,并说明适用的限制和假设。