【问题标题】:How can I select a substring based on day within a date range如何根据日期范围内的日期选择子字符串
【发布时间】:2014-05-11 09:50:32
【问题描述】:

我正在尝试创建一个脚本来计算存储过程的预期结果。有几个与 sp 相关的表共享一个 BatchId。 x_NonFullTimeEmployees 有一个 StatusString 列,其长度等于 MeasurementStartDateMeasurementStartDate 之间的时间段。 IE。在 7 天的时间里,它可能看起来像 'TAAAAAA'。我正在选择同一时期的时间卡并将它们的值相加。我的问题是我只想使用 TimeCard 值,其中 StartDate 是在 StatusString 中由“A”表示的一天。我该怎么做?

DECLARE @batchid INT = 1;

WITH CTE_ACTIVENFS
AS
(
    select e.EmployeeId,e.OrganizationId,e.MeasurementStartDate, e.MeasurementEndDate
    from x_VHEActiveNonFullTimeEmployees e
    where BatchId = @batchid
)
,
CTE_RESULTS
AS
(
    SELECT  tc.OrganizationId ,tc.EmployeeId, SUM(tc.workhour) AS "Total Paid Hours", 
    DATEDIFF(month, (SELECT TOP 1 StartDate  FROM TimeCard WHERE EmployeeId = tc.EmployeeId),(SELECT TOP 1 StartDate  FROM TimeCard WHERE EmployeeId = tc.EmployeeId ORDER BY StartDate DESC)) 
    AS "Total Paid Period",
    SUM(tc.workhour)/ DATEDIFF(month, (SELECT TOP 1 StartDate  FROM TimeCard WHERE EmployeeId = tc.EmployeeId),(SELECT TOP 1 StartDate  FROM TimeCard WHERE EmployeeId = tc.EmployeeId ORDER BY StartDate DESC))
    AS "Average Worked Hours"
    FROM TimeCard tc INNER JOIN CTE_ACTIVENFS hire ON hire.EmployeeId = tc.EmployeeId
    WHERE tc.EmployeeId IN (SELECT EmployeeId FROM CTE_ACTIVENFS)
    AND tc.StartDate  BETWEEN (SELECT TOP 1 MeasurementStartDate FROM CTE_ACTIVENFS) AND (SELECT TOP 1 MeasurementEndDate FROM CTE_ACTIVENFS)
    AND tc.OrganizationId = (SELECT TOP 1 OrganizationId FROM CTE_ACTIVENFS)
    GROUP BY tc.EmployeeId, tc.OrganizationId
)
SELECT * FROM CTE_RESULTS

【问题讨论】:

    标签: sql-server sql-server-2012 substring common-table-expression date-range


    【解决方案1】:

    首先我想说你的查询真的很乱。所有的SELECT TOP 1 都应该变成连接。现在对于您的问题,我会这样做:

    select *
    from x_NonFullTimeEmployees hire
    inner join timecard tc
      on tc.EmployeeId = hire.EmployeeId
      and tc.StartDate between hire.MeasurementStartDate and hire.MeasurementEndDate
      and substring(
        hire.StatusString, 
        datediff(dd, hire.MeasurementStartDate, tc.StartDate) +1, 
        1) = 'A'
    where hire.BatchId = @batchid
    

    【讨论】:

    • 感谢 TomT,对马虎感到抱歉。我刚刚开始我的 SQL 培训
    • 你能详细说明一下连接吗
    • @AntarrByrd 例如WHERE ... AND tc.OrganizationId = (SELECT TOP 1 OrganizationId FROM CTE_ACTIVENFS) 应该是FROM TimeCard tc INNER JOIN CTE_ACTIVENFS hire ON ... AND tc.OrganizationId = hire.OrganizationId,顺便说一句,我不认为你真的需要第一个 CTE
    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2011-07-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    相关资源
    最近更新 更多