【问题标题】:SQL Server Between Start and End dates开始日期和结束日期之间的 SQL Server
【发布时间】:2014-08-12 02:48:39
【问题描述】:

我正在创建一个内部假期预订系统,我需要将业务逻辑规则落实到位,但我需要检查在开始日期和结束日期之间的日期有多少人被预订,因为例如 2 个学徒可能只能预订 1 天,但我没有办法抓住两者之间的日期。

任何帮助将不胜感激

下面是工作角色表

【问题讨论】:

  • 您使用的是什么 RDBMS(Oracle、SQL Server 2008R2、SQLLite 等)?

标签: sql sql-server


【解决方案1】:

您还没有发布 RDBMS,或者表的名称,或者 Job Role 表应该做什么......但无论如何我都会对此进行尝试。我正在使用递归 CTE 来生成日期列表,但使用 Date 表对您来说会好得多,而且我什至不知道您的 RDBMS 是否会支持这一点。我还在下面发布了一个表格变量的语法,它填充了模仿您的样本的数据。

最终的输出自然需要进行定制以完成您需要做的任何事情。但是,这确实会向您显示多个员工休假的每个日期的列表。如有必要,向第二个 JOINWHERE 子句添加额外条件以过滤其他内容(如 JobRole)。

-- Code originally from http://smehrozalam.wordpress.com/2009/06/09/t-sql-using-common-table-expressions-cte-to-generate-sequences/

-- Define start and end limits
DECLARE @todate DATETIME, @fromdate DATETIME
SELECT @fromdate='2014-01-01', @todate=GETDATE()-1

DECLARE @TimeOff TABLE (StartDate DATETIME, EndDate DATETIME, EmployeeID INT)

INSERT INTO @TimeOff (StartDate, EndDate, EmployeeID)
SELECT '1/1/2014', '1/7/2014', 7 UNION 
SELECT '2/1/2014', '2/7/2014', 7 UNION 
SELECT '3/3/2014', '3/9/2014', 7 UNION 
SELECT '2/5/2014', '2/6/2014', 8 

;WITH DateSequence( Date ) AS -- this will list all dates.  Use this if you don't have a date table
  (
    SELECT @fromdate as Date
    UNION ALL 
    SELECT DATEADD(DAY, 1, Date)
    FROM DateSequence
    WHERE Date < @todate
  )

--select result
SELECT DateSequence.Date, TimeOffA.StartDate, TimeOffB.EndDate, TimeOffA.EmployeeID
FROM 
    DateSequence -- a full list of all possible dates
     INNER JOIN 
    @TimeOff TimeOffA ON -- all dates when an employee is on vacation -- replace this with your actual table's name
        DateSequence.Date BETWEEN TimeOffA.StartDate AND TimeOffA.EndDate
     INNER JOIN 
    @TimeOff TimeOffB ON -- all dates when an employee who is NOT employee A is on vacation -- replace this with your actual table's name
        DateSequence.Date BETWEEN TimeOffB.StartDate AND TimeOffB.EndDate AND
        TimeOffA.EmployeeID <> TimeOffB.EmployeeID
option (MaxRecursion 2000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2017-01-05
    相关资源
    最近更新 更多