2

ペイロールシステムを作成していて、zktechnologyからB3 tftを購入し、レコードをアレンジしたいと思います。

現在、次の形式で生体認証からデータを取得できます。

EmpIDInOutMode日付をカウントします
1 1 0 2012/8/20 07:49:01
2 1 1 2012/8/20 12:08:21
3 102012年8月20日12:43:10
4 1 1 2012/8/20 17:56:15
5 2 0 2012/8/20 07:53:11
6 2 1 2012/8/20 12:02:01
7 2 0 2012/8/20 12:39:56
8 2 1 2012/8/20 17:20:43
9 1 0 2012/08/21 08:10:20
10 1 1 8/21/2012 12:01:26
11 1 0 2012/8/21 13:03:11
12 1 1 2012/8/21 17:11:15
13 2 0 8/21/2012 07:48:26
14 2 1 2012/8/21 12:14:58
15 2 0 8/21/2012 12:59:31
16 2 1 2012/8/21 17:20:12

InOutMode:

0 =イン、1=アウト

ここで、上記のデータを次のように変換します。

EmpID日付AM_InAM_OutPM_In PM_Out
1 8/20/2012 07:49:01 12:08:21 12:43:10 17:56:15
2 8/20/2012 07:53:11 12:02:01 12:39:56 17:20:43
1 8/21/2012 08:10:20 12:01:26 13:03:11 17:11:15
2 8/21/2012 07:48:26 12:14:58 12:59:31 17:20:12

したがって、EmpID、Date、AM_In、AM_Out、PM_In、PM_Outフィールドを使用してデータベースに保存できます。

以前、ここで同様のコードを見ましたが、URLを思い出せません。

アップデート:

VB.netコードまたはmsアクセス形式のSQLを使用できます。

4

3 に答える 3

3

2つのクロスタブとクエリを作成して、それらを利用可能な日付と従業員に結合するのが最も簡単な場合があります。

午前1時のクロス集計

TRANSFORM Min(tm.Date) AS MinOfDate
SELECT Format([Date],"dd/mm/yyyy") AS dt, tm.EmpID
FROM tm
GROUP BY Format([Date],"dd/mm/yyyy"), tm.EmpID
PIVOT tm.InOutMode;

午後2時のクロス集計

TRANSFORM Max(tm.Date) AS MinOfDate
SELECT Format([Date],"dd/mm/yyyy") AS dt, tm.EmpID
FROM tm
GROUP BY Format([Date],"dd/mm/yyyy"), tm.EmpID
PIVOT tm.InOutMode;

ここで、tmはテーブルの名前です。

その後、これらに参加できます。

SELECT Alldates.dt, 
       Alldates.empid, 
       am.[0] AS [Am In], 
       am.[1] AS [Am Out], 
       pm.[0] AS [Pm In], 
       pm.[1] AS [Pm Out] 
FROM   ((SELECT DISTINCT Format([date], "dd/mm/yyyy") AS dt, 
                        empid 
        FROM   tm) AS Alldates 
        LEFT JOIN am 
               ON ( Alldates.empid = am.empid ) 
                  AND ( Alldates.dt = am.dt )) 
       LEFT JOIN pm 
              ON ( Alldates.empid = pm.empid ) 
                 AND ( Alldates.dt = pm.dt ); 
于 2012-08-21T20:47:28.007 に答える
1

MSAccessで必要な結果を生成するクエリは次のとおりです。

select am_in.empid,
    format(am_in.min_in_dt, "MM/DD/YYYY") as [date],
    format(am_in.min_in_dt, "hh:mm:ss") as AM_In,
    format(am_out.min_out_dt, "hh:mm:ss") as AM_Out,
    format(pm_in.max_in_dt, "hh:mm:ss") as PM_In,
    format(pm_out.max_out_dt, "hh:mm:ss") as PM_Out
from
(
    (
        (
           SELECT empid,
              min(dt) as min_in_dt
            FROM yourTable
            where inoutmode = 0
            group by empid
        ) am_in
        inner join
        (
           SELECT empid,
              min(dt) as min_out_dt
            FROM yourTable
            where inoutmode = 1
            group by empid
        ) am_out
            on am_in.empid = am_out.empid
    )
    inner join
    (
       SELECT empid,
          max(dt) as max_in_dt
        FROM yourTable
        where inoutmode = 0
        group by empid
    ) pm_in
        on am_in.empid = pm_in.empid
)
inner join
(
   SELECT empid,
      max(dt) as max_out_dt
    FROM yourTable
    where inoutmode = 1
    group by empid
) pm_out
    on am_in.empid = pm_out.empid
于 2012-08-21T19:12:08.137 に答える
0

このようなものが機能します

select 
    empid,
    dateadd(day,datediff(day,0,DATE),0) as date,
    max(case when sno=1 then convert(varchar(8),DATE,108)) as AM_IN,
    max(case when sno=2 then convert(varchar(8),DATE,108)) as AM_OUT,
    max(case when sno=3 then convert(varchar(8),DATE,108)) as PM_IN,
    max(case when sno=4 then convert(varchar(8),DATE,108)) as PM_OUT
from
(
    select *, 
        row_number() over (partition by empid order by Empid) as sno
    from 
        table 
) as t
group by
    empid,dateadd(day,datediff(day,0,DATE),0) 
于 2012-08-21T09:47:02.847 に答える