0

ステータスが 1 と 2 のユーザーのログ時間を含むテーブルがあります。ステータスが 1 の場合はログイン時間であり、ステータスが 2 の場合はログアウト時間です。

そこで、ユーザーのログイン・ログアウト時間を表示したい。ログアウト時間がない場合、列の値は null にする必要があります。

これは、テーブル構造とクエリに関するサンプル デモです...

すべてのログイン時間に対して表示されるログアウト時間を取得します......

出力を次のようにします。

CLOCKIN     CLOCKOUT
9:25:41 AM  9:30:41 AM
9:35:41 AM  9:40:41 AM
9:45:41 AM  
10:06:33 AM 2:59:51 PM
4

2 に答える 2

1

いくつかの相関サブクエリを使用して実行できます。

SELECT   CONVERT(NVARCHAR(20),cin.logtime,108) AS CLOCKIN
        ,CONVERT(NVARCHAR(20),( SELECT MIN(cout.logtime) 
                                FROM table1 cout 
                                WHERE cin.logtime < cout.logtime 
                                AND cout.statusId = 2 
                                AND NOT EXISTS (SELECT * FROM table1 cin2 
                                                WHERE cin2.logtime > cin.logtime 
                                                AND cin2.logtime < cout.logtime 
                                                AND cin2.statusId = 1
                                                )
                                ),108) AS CLOCKOUT
FROM table1 cin
WHERE cin.statusId = 1

ほとんどの外側のクエリはすべてのチェックを取得し、最初のサブクエリ (外側) はチェックイン後に最小限のチェックアウトを取得し、2 番目のサブクエリ (最も内側) はチェックイン後にチェックインがあったかどうかをチェックするだけです - 重複の代わりに 3 行目に NULL を作成します 14:59

SQLFiddle デモ

于 2013-06-12T09:16:25.470 に答える
0

CONVERT関数にはスタイル 22 を使用します。

select convert (varchar (20), cast (getdate() as time) , 22)

または、これをコードに挿入するだけです:

 convert (varchar (20), cast (rt.rt.logTime as time ), 22)
,convert (varchar (20), cast (rt1.rt.logTime as time ), 22)
于 2013-06-12T09:10:34.577 に答える