Sql server 在没有日历表的情况下查找周结束日期的有效方法

Sql server 在没有日历表的情况下查找周结束日期的有效方法,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在MS SSMS中使用下面的SQL代码查找一周结束日期。我经常不得不在星期三和星期天之间切换,作为一周的结束日。另请注意,我的数据集通常是10万个 除了使用日历表之外,还有没有比下面的方法更有效的方法呢 /* Declare Variables */ DECLARE @WeekendingDay VARCHAR(10); DECLARE @DayNumber INT; DECLARE @InputDate VARCHAR(10); DECLARE @conInputDate DATETIME

我正在MS SSMS中使用下面的SQL代码查找一周结束日期。我经常不得不在星期三和星期天之间切换,作为一周的结束日。另请注意,我的数据集通常是10万个

除了使用日历表之外,还有没有比下面的方法更有效的方法呢

/* Declare Variables */
DECLARE @WeekendingDay VARCHAR(10);
DECLARE @DayNumber INT;
DECLARE @InputDate VARCHAR(10);
DECLARE @conInputDate DATETIME;
DECLARE @outWeekending DATETIME;
DECLARE @CovertToInt VARCHAR(10);

/* --------------------Inputs-------------------- */

/* uncomment the weekending day you want */
--Set @WeekendingDay = 'Monday'
--Set @WeekendingDay = 'Tuesday'
--Set @WeekendingDay = 'Wednesday'
--Set @WeekendingDay = 'Thursday'
--Set @WeekendingDay = 'Friday'
--Set @WeekendingDay = 'Saturday'
SET @WeekendingDay = 'Sunday';

/* Date you want the weekending of */               
SET @InputDate = '29/12/2016';

/* --------------------Process-------------------- */
SET @DayNumber = CASE @WeekendingDay
                   WHEN 'Sunday' THEN 1
                   WHEN 'Monday' THEN 2
                   WHEN 'Tuesday' THEN 3
                   WHEN 'Wednesday' THEN 4
                   WHEN 'Thursday' THEN 5
                   WHEN 'Friday' THEN 6
                   WHEN 'Saturday' THEN 7
                 END;


SET @conInputDate = CONVERT(DATETIME, @InputDate, 103);
SET @outWeekending = DATEADD(dd,
                             CASE WHEN DATEPART(DW, @conInputDate) = @DayNumber
                                  THEN 0
                                  ELSE -1 * DATEPART(DW, @conInputDate) + 7
                                       + @DayNumber
                             END, @conInputDate);

/* --------------------Output-------------------- */
PRINT @outWeekending;

这将给你一周中的星期一。根据您希望使用哪一天作为终点,您可以根据需要进行调整

DECLARE @date DATETIME = GETUTCDATE()-5

SELECT
    @date
    ,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0)    --Monday
    ,DATEADD(DD,1,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0))    --Tuesday
    ,DATEADD(DD,2,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0))    --Wednesday
    ,DATEADD(DD,3,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0))    --Thursday
    ,DATEADD(DD,4,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0))    --Friday
    ,DATEADD(DD,5,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0))    --Saturday
    ,DATEADD(DD,6,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0))    --Sunday

这个问题会引出很多导致关闭的观点,但是如果你说的很多,那么我会考虑一个日历表(从某个日期)到(将来的某个日期,从现在开始的几年)。它只需要计算一次。。。然后,从现在起,您可以查询或加入它,从而节省大量时间。是否要计算10万条记录中每个记录的“周末”日期?表达式是否将构成基于集合的SQL查询的一部分?通过直接设置DayNumber而不是WeekendingDay,您可以节省一个案例,但它不会节省任何成本time@Cato我会在一组查询中使用它。这只是为了演示而打印。@scsimon谢谢。我总是在日期表和即时工作之间左右为难。我永远不得不修改日期表,因为我的公司喜欢在部门之间切换视图,并在新的一年开始时进行更改。我们每年的年初都有所不同,这取决于时间表周的安排。感谢您的回复。我还没有运行它,但是如果这一天是星期一,它会显示下星期一还是当前星期一作为一周的结束?这将给出日期周的星期一。因此,如果@date是星期一,它将给出这一天。如果是星期二,它会给前一天。将其调整为星期天,如果在星期一运行,将给出下一个星期天。如果在星期天跑步的话,那就是那天了。