【问题标题】:Find range of dates within same column在同一列中查找日期范围
【发布时间】:2015-07-22 23:51:21
【问题描述】:

我有一个数据集,如下所示:

ResourceID RequirementId ProjectID Startdate EndDate BillingPercentage -------------------- -------- ---------- ---------- ------------------------ ----- ------ ---------------------------------------- 1 5066 7505 2015-09-15 00:00:00.000 2015-09-30 00:00:00.000 50 2 4748 7499 2015-09-10 00:00:00.000 2015-09-20 00:00:00.000 50

我想计算我查询的特定月份的范围和相应的计费百分比:

插入@DateTimeline 选择 @MonthStartDate 作为 OSTARTDATE,@MonthEndDate 作为 OENDDATE,0 插入@DateTimeline SELECT Startdate AS OSTARTDATE,EndDate AS OENDDATE,BillingPercentage From @RESOURCE_UNBILLED Order by Startdate 插入@DateTimeline SELECT EndDate AS OSTARTDATE,EndDate AS OENDDATE,BillingPercentage From @RESOURCE_UNBILLED Order by Startdate

数据如下所示:

 SerialNo OSTARTDATE OENDDATE BillingPercentage
----------- ------------------------ ---------------- -------- ----------------------------------------
1 2015-09-01 00:00:00.000 2015-09-30 00:00:00.000 0
2 2015-09-10 00:00:00.000 2015-09-20 00:00:00.000 50
3 2015-09-15 00:00:00.000 2015-09-30 00:00:00.000 50
4 2015-09-20 00:00:00.000 2015-09-20 00:00:00.000 50
5 2015-09-30 00:00:00.000 2015-09-30 00:00:00.000 50

我想像下面这样检索数据

 OSTARTDATE OENDDATE BillingPercentage
----------- ------------------------ ---------------- -------- ----------------------------------------
2015-09-01 00:00:00.000 2015-09-10 00:00:00.000 0
2015-09-10 00:00:00.000 2015-09-15 00:00:00.000 50
2015-09-15 00:00:00.000 2015-09-20 00:00:00.000 100
2015-09-20 00:00:00.000 2015-09-30 00:00:00.000 50

请建议我怎样才能得到这个我也可以在这里使用枢轴吗?

【问题讨论】:

  • 有点难以理解您的预期输出来自何处。您的计算查询中的@RESOURCE_UNBILLED 是什么数据?在您的决赛桌中,您的开始和结束日期范围来自哪里?

标签: sql sql-server pivot


【解决方案1】:

使用表变量来存储您的 @dateStamps 和列:SerialNoOSTARTDATEOENDDATE

试试这个查询:

SELECT  d.SerialNo, d.OSTARTDATE, d.OENDDATE
        , ( SELECT SUM(t.BillingPercentage)
            FROM yourTable t
            WHERE d.OENDDATE BETWEEN t.Startdate AND t.EndDate
               OR d.OSTARTDATE BETWEEN t.Startdate AND t.EndDate
               OR (d.OSTARTDATE > t.Startdate AND d.OENDDATE < t.EndDate)
              ) AS BillingPercentage
FROM 
    @dateStamps d 

我的完整代码是:

DECLARE @DatePart as int = 5

;WITH dateStamps AS (
    SELECT 1 As SerialNo, CAST('2015-' + CONVERT(varchar, MONTH(MIN(t.Startdate))) + '-01 00:00:00.000' As datetime) AS OSTARTDATE
                        , CAST('2015-' + CONVERT(varchar, MONTH(MIN(t.Startdate))) + '-01 00:00:00.000' As datetime) + (@DatePart - 1) AS OENDDATE

    FROM yourTable t
    UNION ALL 
    SELECT ds.SerialNo + 1, ds.OSTARTDATE + @DatePart, ds.OSTARTDATE + (@DatePart * 2 - 1)
    FROM dateStamps ds
    WHERE MONTH(OSTARTDATE + @DatePart) <= MONTH(ds.OSTARTDATE)
)
SELECT  d.SerialNo, d.OSTARTDATE, d.OENDDATE
        , ( SELECT SUM(t.BillingPercentage)
            FROM t
            WHERE d.OENDDATE BETWEEN t.Startdate AND t.EndDate
               OR d.OSTARTDATE BETWEEN t.Startdate AND t.EndDate
               OR (d.OSTARTDATE > t.Startdate AND d.OENDDATE < t.EndDate)
              ) AS BillingPercentage
FROM 
    dateStamps d 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2019-02-28
    • 1970-01-01
    • 2016-09-22
    • 2016-10-08
    • 2010-11-20
    相关资源
    最近更新 更多