【问题标题】:SQL Date Range between a week by week rangeSQL Date Range 每周之间的范围
【发布时间】:2016-02-05 04:44:11
【问题描述】:

我们正在为员工假期制作日期范围选择器

例如,我将以 2016 年 1 月为例,我们的系统从星期日到星期六

如果员工在 1 月 14 日至 20 日休假,他们应该在 10-16 日和 17-23 日的日期范围内

我只是想不出如何编写一个将其限制为这两个日期的 sql 查询。

我拥有的是:

DECLARE @WeekRangeStart DATETIME ='2016/01/10';
DECLARE @WeekRangeEnd DATETIME = '2016/01/16';

SELECT [ID], 
       [EmpName], 
       [EmpType] 
FROM Vacations
WHERE VacationStartDate >= @WeekRangeStart OR VacationEndDate >= @WeekRangeStart 

--OUTPUT
--ALL DAYS BEFORE THIS WOULD BE TRUE...
--1/14/2016 >= 1/10/2016 TRUE
--1/20/2016 >= 1/10/2016 TRUE
-- NEXT WEEK 
--1/14/2016 >= 1/17/2016 FALSE
--1/20/2016 >= 1/17/2016 TRUE
-- NEXT WEEK 
--1/14/2016 >= 1/24/2016 FALSE
--1/20/2016 >= 1/24/2016 FALSE
--ALL DAYS AFTER THIS DAY WOULD BE FALSE...

但这仅适用于已经过去的事情,但是如果我要在三月预订一天,我总是会显示在时间表上,因为我的开始日期会比今天大。我应该如何将其限制在该范围内?

【问题讨论】:

标签: sql-server tsql


【解决方案1】:
DECLARE @WeekRangeStart DATETIME ='2016/01/10';
DECLARE @WeekRangeEnd DATETIME = '2016/01/16';

SELECT [ID], 
   [EmpName], 
   [EmpType] 
FROM Vacations
WHERE VacationStartDate between @WeekRangeStart and @WeekRangeEnd
     or VacationEndDate Between @WeekRangeStart and @WeekRangeEnd

【讨论】:

  • 如果他们休假 2 个月,这可能会失败,您需要查找重叠的日期范围
【解决方案2】:

这可能很有用。使用递归 CTE,我得到了假期跨度的所有日期。然后根据提供的周范围返回它跨越的周。

DECLARE @WeekRangeStart DATETIME ='2016/01/10';
DECLARE @WeekRangeEnd DATETIME = '2016/01/16';
DECLARE @VacationStartDate DATETIME = '2016-01-14'
DECLARE @VacationEndDate DATETIME = '2016-01-20'


;WITH cte AS
  (
    SELECT @VacationStartDate AS Dates
    UNION ALL
    SELECT DATEADD(dd, 1, dates)
    FROM cte
    WHERE dates < @VacationEndDate
  ) 

SELECT DISTINCT
 DATEADD(dd, -(DATEPART(dw, dates)-1), dates) AS WeekStartDate,
 DATEADD(dd, 7-(DATEPART(dw, dates)), dates) AS WeekEndDate
FROM cte
WHERE dates BETWEEN @WeekRangeStart AND @WeekRangeEnd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2020-01-20
    • 2021-01-27
    • 2021-10-23
    相关资源
    最近更新 更多