簡體   English   中英

如何根據兩個不同的 case 語句獲得 Datediff 計算?

[英]How to get a Datediff calculation based on two different case statements?

我有一個很長的選擇查詢,但已在此處粘貼了相關部分。

我需要弄清楚如何獲取 OrderSignedDate 和 OrderIssuedDate 之間的 datediff,它們分別位於我的選擇查詢中的單獨 case 語句中。 任何幫助將不勝感激:

select tkh.task_id
,cas.case_number as CaseNo
,cst.description as CaseStatus
,cas.title as Title
,ztt.description as OrderType
,tkh.task_status

--Order Signed Date
,(select (case when 
zrt.description = 'Administrative Law Judge'
and tka.completed_date is not null
then convert(varchar(10), tka.completed_date, 101) END) 
from ecl_task_actor tka
join ecl_resource res on tka.entity_pk_id = res.resource_id
join ecl_z_resource_type zrt on res.resource_type_id = zrt.resource_type_id
where tka.task_id = tkh.task_id
and tka.task_actor_status <> 'D'
and zrt.description = 'Administrative law judge') as OrderSignedDate

--Date Order was Issued
,(select (case when 
zrt.description = 'Order Processor Team'
and tka.completed_date is not null
then convert(varchar(10), tka.completed_date,101)
END) 
from ecl_task_actor tka
join ecl_resource res on tka.entity_pk_id = res.resource_id
join ecl_z_resource_type zrt on res.resource_type_id = zrt.resource_type_id
where tka.task_id = tkh.task_id
and tka.task_actor_status <> 'D'
and zrt.description = 'Order processor Team') as OrderIssuedDate


from ecl_task_header tkh
join ecl_case cas on tkh.case_id = cas.case_id
JOIN ecl_z_case_status_type as cst on cst.case_status_type_id = cas.case_status_type_id
join ecl_z_task_type ztt on tkh.task_type_id = ztt.task_type_id

where ztt.description like '%Issue%'
order by cas.case_number asc

其實一點也不難。 您的選擇如下所示:

select ...,
(...) as OrderSignedDate,
(...) as OrderIssueDate,
...

... 表示某些東西在那里保持不變。 現在,讓我們將其用作table

select ..., OrderSignedDate, OrderIssueDate, ...,
from (
select ...,
(...) as OrderSignedDate,
(...) as OrderIssueDate,
...
) t

而在外部select這是你的周圍包裹的初始select ,您可以使用OrderSignedDateOrderIssueDate為列,你可以datediff他們。

我假設您希望將此內聯添加到現有查詢中。

由於定義兩個現有日期的子選擇通過它們的WHERE子句與外部查詢相關聯,因此沒有一種很好的方法可以避免重復代碼。 另一方面,這意味着它就像重復代碼一樣簡單。 使用現有的子選擇作為DATEDIFF的參數。

這應該有效:

...<The current SELECT list, plus>
  ,DATEDIFF
  (
    DAY,
    (--Order Signed Date
    SELECT (CASE
              WHEN zrt.description = 'Administrative Law Judge'
                   AND tka.completed_date IS NOT NULL
                THEN CONVERT(varchar(10), tka.completed_date, 101)
            END
           )
    FROM
      ecl_task_actor AS tka
    JOIN
      ecl_resource AS res
        ON
        tka.entity_pk_id = res.resource_id
    JOIN
      ecl_z_resource_type AS zrt
        ON
        res.resource_type_id = zrt.resource_type_id
    WHERE
      tka.task_id = tkh.task_id
      AND tka.task_actor_status <> 'D'
      AND zrt.description = 'Administrative law judge'
    ),
   (--Date Order was Issued
    SELECT (CASE
              WHEN zrt.description = 'Order Processor Team'
                   AND tka.completed_date IS NOT NULL
                THEN CONVERT(varchar(10), tka.completed_date, 101)
            END
           )
    FROM
      ecl_task_actor AS tka
    JOIN
      ecl_resource AS res
        ON
        tka.entity_pk_id = res.resource_id
    JOIN
      ecl_z_resource_type AS zrt
        ON
        res.resource_type_id = zrt.resource_type_id
    WHERE
      tka.task_id = tkh.task_id
      AND tka.task_actor_status <> 'D'
      AND zrt.description = 'Order processor Team'
   )
  ) AS DaysBetween
... <The rest of the query>

編輯:這應該有效,因為這兩個子選擇都解析為每行數據的日期,所以我們只是為DATEDIFF函數重用這兩個日期。 它會增加一點開銷,但我的猜測是,對於已經如此龐大的查詢,瞬間性能不一定是主要問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM