1

そのようなテーブル変数がある場合、この変数をループして処理を行う方法:

DECLARE @userData TABLE(
                                    userId int NOT NULL,
                                    dayDate datetime NOT NULL,
                                    transIn datetime NULL,
                                    transOut datetime NULL,
                                    attIn datetime NULL,
                                    attOut datetime NULL,
                                    MissionIn datetime NOT NULL,
                                    MissionOut datetime NOT NULL,
                                    empState varchar(10) NULL
                                   );


                INSERT INTO @userData
                SELECT userid, trans_date,transtime_in,transtime_out,att_start_time,att_end_time,@Mission_fromdatetime,@Mission_todatetime,day_flag
                FROM datatable_o a
                WHERE a.userid = @userid AND a.trans_date = @date ORDER BY  transtime_in ;

コメントによると、ケース全体:

作業が : に開始され、 (作業期間]att_start_timeに終了する場合att_end_time

すべての従業員は、同じ日に何度もチェックインおよびチェックアウトできるため、彼に従うことができました。に保存されたチェックインとに保存されたtranstime_in チェックアウトtranstime_out

そして、私はday_flagその日が「W」の勤務日または「E」の週末であることを知ることができるようにしました

これらすべての情報に加えて、emp_num ,date

私は従業員のために計算したいExternal mission over time

私には4つのケースがあります:

  1. No check-in-out && Not work day [週末] したがって、従業員はすべてのミッション期間を残業にする必要があります
  2. チェックインアウト && 勤務日 [不在] がないため、従業員は勤務期間のうちミッション期間のみを取る必要があります
  3. チェックイン アウト && 非稼働日 [週末] があるため、従業員はこれらのチェックイン アウトからミッション期間のみを取得する必要があります
  4. チェックインアウト && 就業日があるため、従業員はこれらのチェックインアウトのうちミッション期間のみを取得し、同時に勤務期間を終了する必要があります。

例 :

emp_num     date         att_start   att_end    mission-in  mission-out
  672      2015-3-4       07:05:00    13:30:00   12:12:00    20:00:00

emp_num      date         trans_in     trans_out 

 672       2015-3-4       06:54:00     11:10:00
 672       2015-3-4       12:00:00     14:05:00
4

1 に答える 1

1

そのテーブルのコピーから助けを借りて、テーブルをループできます。

あなたのテーブルが次のとおりであると仮定して、あなたの質問に関して:

DECLARE @userData TABLE(
                         userId int NOT NULL,
                         /*Other fields*/
                        );

テーブルのデータは次のとおりです。

INSERT INTO @userData
/*A SELECT or values*/

テーブルのコピーを次のように作成します。

DECLARE @userData_2 TABLE(
                         userId int NOT NULL,
                         /*Structure should be the same as @userData*/
                        );
INSERT INTO @userData_2
SELECT * FROM  @userData

これで、ループを実行して、好きなことを実行できます。

DECLARE @userId INT
WHILE EXISTS (SELECT * FROM @userData_2)
BEGIN
SET @userId=(SELECT TOP 1 userId FROM @userData)
/*

DO YOUR TRANSACTION HERE

*/
DELETE FROM @userData_2 WHERE userId=@userID
END

注意:これは、userId が一意であることを前提としています。そうでない場合は、一意のフィールドを持つか、userId の代わりに複合フィールドを使用する必要があります。

于 2015-04-08T10:32:14.023 に答える