0

タイムテーブルを生成するために必要なクエリとデータがあります。

私の現在のクエリは以下のとおりです。

SELECT contract.lect_code code1,
       contract.coll_code code2,
       line_date,
       start_time,
       end_time,
       DATEPART(DW,line_date) AS day_number,
       datename (dw,line_date) AS nameofday,
       convert(varchar(8),start_time,108) AS start_time2,
       convert(varchar(8),end_time,108) AS end_time2
FROM bk_line
INNER JOIN contract ON contract.contract_no = bk_line.contract_no
WHERE line_date BETWEEN '2013/09/23' AND '2013/09/27'
  AND coll_code = 'TEL01'
  AND bk_line_status = 'CE'
--And lect_code = 10430973 

これにより、次の形式のデータが得られます。ここに画像の説明を入力

コード 1 と行の日付ごとに時間を 15 分のスロットに分割する方法が必要です。

このようなもの:

code1 | code2 | line_date | 0900worked | 0915worked | 0930worked |

の値はまたはに0900workedなります。TF

--

編集

期間を code1 と line_date でグループ化する必要があります。したがって、上記の例では、1045096は で 2 つのセッションを実行しました2013/09/25。すべての期間が計算された状態で、両方のセッションが同じ行に表示される必要があります。

4

3 に答える 3

1

このようにすることもできますが、特定の間隔で誰かが働いたかどうかを確認するより良い方法があると思います!

with "nums"
as
(
  select 1 as "value"
  union all select "value" + 15 as "value"
  from "nums"
  where "value" <= 95*15
)
, "intervals"
as
(
  select
  "id" = "value" / 15
  , "startDate" =  dateadd( minute, "value" -1 , dateadd(year, datediff(year, 0, getdate()), 0))
  , "endDate" =  dateadd( minute, "value" + 14, dateadd( year, datediff( year, 0, getdate()), 0 ))

from
  "nums"
)
,"matched"
as
(
select 
    I.*
    , D."id" as "code1" 
from 
    intervals as I
left join "data" as D
    on D."startDate" <= I."startDate"
    and D."endDate" >= I."endDate"
)   
select
*
from
(
  select
    "code1"
    , "startDate"
  from
    "matched"
) as Data
  pivot( count(Data."startdate") 
  for "startDate" 
  in (  "2013-01-01 00:00:00.000"
      , "2013-01-01 00:15:00.000" 
      , "2013-01-01 00:30:00.000" 
      , "2013-01-01 00:45:00.000" 
      , "2013-01-01 01:00:00.000" 
      , "2013-01-01 01:15:00.000" 
      , "2013-01-01 01:30:00.000" 
      , "2013-01-01 01:45:00.000" 
      , "2013-01-01 02:00:00.000" 
      , "2013-01-01 02:15:00.000" 
      , "2013-01-01 02:30:00.000" 
     )) as p
where p.code1 is not null

SQLフィドル

于 2013-09-27T12:29:23.017 に答える
0

おそらく、次のようなものを使用して間隔テーブルを作成します。

;with t as
 (
 select cast('00:00:00' as time) as intStart,
 0 as l
 union all
 select DATEADD(MINUTE, 15,intStart),
 l+1
 from t
 where intStart<='23:30:00'
 )
select * 
from t;

次に、これを使用してデータに結合し、1 日の 15 分間隔のいずれかを調べる範囲を与えます。

次に、任意の間隔に対して Andomar の select ステートメントを使用できます。

于 2013-09-27T12:11:51.537 に答える