Oracle DB查询格式

时间:2008-11-28 18:48:58

标签: oracle select concatenation

在对Oracle数据库进行查询时,我遇到了格式化数据的问题。

我想要做的是将一些数据导出到下面的格式文本文件中;

    1IN20071001      40005601054910101200            1   65
  • 第一个号码(上面1个)=公司号码(位置1-5,空白空白)
  • IN或UT = IN表示clockin,UT表示clockout(位置6-7)
  • 20071001 =日期(营业日期),格式为YYYYMMDD(位置8-15)
  • 400056010549 = EmployeeID(位置16-33,右对齐,空白前方)
  • 101012 =时间格式TTMMSS(pos 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?

3 个答案:

答案 0 :(得分:2)

如果t.clockindatetime是oracle DATE那么为什么不使用:
TO_CHAR(t.clockindatetime, 'YYYYMMDD')代表日期部分和 时间部分TO_CHAR(t.clockindatetime, 'HHMISS')(如果您希望24小时格式的小时使用TO_CHAR(t.clockindatetime, 'HH24MISS')(小时数仍然只占用2个字符))

答案 1 :(得分:2)

此外,您可以使用rpad and lpad来填充输出并截断额外的字符

答案 2 :(得分: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列的“公司编号”以及如何锁定时间信息卡以进行篡改,但是可以等到星期一。

非常感谢! /彼得