Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
选择当前、上一周或下周的T-SQL查询_Sql_Sql Server 2008_Tsql - Fatal编程技术网

选择当前、上一周或下周的T-SQL查询

选择当前、上一周或下周的T-SQL查询,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我相信我有一个很难回答的问题 假设下图是结果集的一部分 我需要写一个查询,根据一些参数,将给出当前工作日星期五和前一周以及下一周的工作日。从前端单击链接按钮 假设今天是第四天,那么它将返回我30,1,2,3,4 以下是表格结构。欢迎提出任何改进此方法的建议 我在Gridview中的最终输出将是这样的 DECLARE @CurrentDate SMALLDATETIME; -- Or DATE SET @CurrentDate = '20131004' SELECT DATEADD(DAY,

我相信我有一个很难回答的问题

假设下图是结果集的一部分

我需要写一个查询,根据一些参数,将给出当前工作日星期五和前一周以及下一周的工作日。从前端单击链接按钮

假设今天是第四天,那么它将返回我30,1,2,3,4

以下是表格结构。欢迎提出任何改进此方法的建议

我在Gridview中的最终输出将是这样的

DECLARE @CurrentDate SMALLDATETIME; -- Or DATE

SET @CurrentDate = '20131004'

SELECT  DATEADD(DAY, (DATEDIFF(DAY, 0, @CurrentDate) / 7) * 7, 0)  AS FirstDayOfTheWeek,
        DATEADD(DAY, (DATEDIFF(DAY, 0, @CurrentDate) / 7) * 7 + 4, 0)  AS LastDayOfTheWeek
结果:

FirstDayOfTheWeek       LastDayOfTheWeek
----------------------- -----------------------
2013-09-30 00:00:00.000 2013-10-04 00:00:00.000
周一至周五之间的所有日期:

DECLARE @CurrentDate DATE;
DECLARE @WeekNum SMALLINT;

SET @CurrentDate = '20131004'
SET @WeekNum = +1; -- -1 Previous WK, 0 Current WK, +1 Next WK

SELECT   DATEADD(DAY, dof.DayNum, fdow.FirstDayOfTheWeek) AS DayAsDateTime
FROM    (VALUES (DATEADD(DAY, (DATEDIFF(DAY, 0, @CurrentDate) / 7) * 7 + @WeekNum*7, 0)))  fdow(FirstDayOfTheWeek)
CROSS JOIN (VALUES (0), (1), (2), (3), (4)) dof(DayNum)

/*
DayAsDateTime
-----------------------
2013-10-07 00:00:00.000
2013-10-08 00:00:00.000
2013-10-09 00:00:00.000
2013-10-10 00:00:00.000
2013-10-11 00:00:00.000
*/

SELECT  *
FROM
(
SELECT   DATEADD(DAY, dof.DayNum, fdow.FirstDayOfTheWeek) AS DayAsDateTime, dof.DayNum
FROM    (VALUES (DATEADD(DAY, (DATEDIFF(DAY, 0, @CurrentDate) / 7) * 7 + @WeekNum*7, 0)))  fdow(FirstDayOfTheWeek)
CROSS JOIN (VALUES (0), (1), (2), (3), (4)) dof(DayNum)
) src 
PIVOT( MAX(DayAsDateTime) FOR DayNum IN ([0], [1], [2], [3], [4]) ) pvt

/*
0                       1                       2                       3                       4
----------------------- ----------------------- ----------------------- ----------------------- -----------------------
2013-10-07 00:00:00.000 2013-10-08 00:00:00.000 2013-10-09 00:00:00.000 2013-10-10 00:00:00.000 2013-10-11 00:00:00.000
*/

以下是我最初对这个问题的解释:给我本周的日期,也可以选择上一周和下一周的日期。我的解决方案是相同的,不管您是否已经有一个充满日期的表,奇怪的是没有日期列:


如果今天是5号或6号呢?在这些情况下,你如何定义本周?如果是第5周或第6周,则显示下一周…如第7周、第8周、第9周或第10周,11您需要一个包含给定日期的一组工作日的窗口是否正确?@Rikalus…是的正确…但它需要来自问题中提供的表格图像…原因…我必须存储数据为什么您的表格没有日期列?您真的需要使用该表来生成集合吗?你打算怎么处理你要归还的那台电视机?上周和下周的可选电视机呢?“中间的3天怎么样?”波格丹……这不是我真正想要的。“亚伦伯特兰德:3天在中间。”波格丹:是的,你原来的答案在本周的星期一和星期五返回。OP明确表示他们希望周一到周五。星期二1+星期三1+星期四1=3。@BogdanSahlean…..您的查询现在对我来说已经足够好了…我会重新考虑我的方法…我会将此标记为答案。@aaron….让我们说我在上一个按钮上单击,它会显示上一周的数据。如果再次单击“上一个”按钮,它是否会落后一周???@user2322507您的按钮单击将必须保持状态并传递当前或选定的日期。上面的代码只是使用今天的日期作为参数。
-- these are your unmentioned parameters
DECLARE @include_previous_week BIT = 1, @include_next_week BIT = 1;


SET DATEFIRST 1; -- Monday

DECLARE @today DATE = SYSDATETIME();
DECLARE @wd SMALLINT = DATEPART(WEEKDAY, @today);
SET @wd -= CASE WHEN @wd < 6 THEN 0 ELSE 7 END;

;WITH n AS 
(
  SELECT TOP (5) rn = ROW_NUMBER() OVER (ORDER BY [object_id]) 
  FROM sys.all_objects ORDER BY [object_id]
)
SELECT the_date = DATEADD(DAY, rn-@wd, @today) FROM n
UNION ALL 
SELECT DATEADD(DAY, rn-7-@wd, @today) FROM n
WHERE @include_previous_week = 1
UNION ALL 
SELECT DATEADD(DAY, rn+7-@wd, @today) FROM n
WHERE @include_next_week = 1
ORDER BY the_date;