3

Oracleデータベースへのクエリを実行するときにデータのフォーマットに問題があります。

私がやりたいのは、いくつかのデータを以下の形式のテキストファイルにエクスポートすることです。

    1IN20071001      40005601054910101200            1   65
  • 最初の番号(上記の1)=会社番号(位置1-5、前の空白)
  • INまたはUT=クロックインの場合はIN、クロックアウトの場合はUT(位置6〜7)
  • 20071001 = YYYYMMDD(pos 8-15)形式の日付(営業日)
  • 400056010549 = EmployeeID(位置16-33、右揃え、前に空白)
  • 101012 = TTMMSS形式の時間(位置34-39)
  • 00 = FT、常に00(位置40-41)
  • 空白=常に8つの空のスペース(位置42-49)
  • 1 =これが何に使用されるかはわかりませんが、常に1である必要があります(位置50、右揃え、前面の空白)
  • 65 =“Kostnadsställe”、ENT_HR_EMPLOYEE.USERALPHA6(位置51-55、右揃え、前に空白)

現在、以下のクエリを使用していますが、これでSQLの知識は終わりです...

COLUMN one FORMAT a5 HEADER  JUSTIFY RIGHT 
COLUMN two FORMAT a8 HEADER two 
COLUMN three FORMAT a18 HEADER three JUSTIFY RIGHT
COLUMN four FORMAT a5 HEADER three JUSTIFY RIGHT

SELECT h.fkod AS one, 'IN',
    SUBSTR(t.clockindatetime,0,4) ||
    SUBSTR(t.clockindatetime,6,2) ||
    SUBSTR(t.clockindatetime,9,2) AS two,
    i.employeeid AS three
    SUBSTR(t.clockindatetime,11,6) || '00        1',  
    h.fkod AS four
FROM ent_time_card_detail t,
    max_employeeid_history i,
    ent_hr_employee h
WHERE h.enthremployeeid = t.enthremployeeid
AND h.payrollid = i.userid
AND t.clockindatetime >= i.from_date
AND (t.clockindatetime < i.to_date OR i.to_date IS NULL);

フォーマットを完了するのに役立つSQL-proはありますか?

4

3 に答える 3

2

t.clockindatetime がオラクルの DATE の場合、使用しない理由:
TO_CHAR(t.clockindatetime, 'YYYYMMDD')日付部分と TO_CHAR(t.clockindatetime, 'HHMISS')時刻部分に (時間を 24 時間形式にしたい場合TO_CHAR(t.clockindatetime, 'HH24MISS')(時間は 2 文字しか使用しません))

于 2008-11-28T19:05:09.167 に答える
2

また、rpad と lpadを使用して、出力をパディングし、余分な文字を切り捨てることができます

于 2008-11-28T19:09:09.940 に答える
1

とても甘い、あなたたちは私の週末を救った!:)

クエリ:

SELECT lpad('1',5) || 'IN' ||
    TO_CHAR(t.clockindatetime, 'YYYYMMDD') ||
    lpad(i.employeeid,18) ||
    TO_CHAR(t.clockindatetime, 'HH24MISS') ||
    '00        1' ||
    lpad('h.useralpha6',5)
FROM ent_time_card_detail t,
    max_employeeid_history i,
    ent_hr_employee h
WHERE h.enthremployeeid = t.enthremployeeid
AND h.payrollid = i.userid
AND t.clockindatetime >= i.from_date
AND (t.clockindatetime < i.to_date OR i.to_date IS NULL);

結果:

    1IN20081106          1234123412101500        1   64                                                                                     
    1IN20081106              234512385100        1   64                                                                                     
    1IN20081107              234515261900        1   64                                                                                     

time_card_detail または hr_employee テーブルが、列 1 に使用する「会社番号」にどのように関連しているか、改ざんのためにタイムカードポストをロックする方法を理解する必要がありますが、それは月曜日まで待つことができます。

本当にありがとう!/ ペッター

于 2008-11-28T21:58:56.727 に答える