【问题标题】:Oracle DB query formattingOracle DB 查询格式化
【发布时间】:2008-11-28 18:48:58
【问题描述】:

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

我要做的是将一些数据导出为以下格式的文本文件;

    1IN20071001      40005601054910101200            1   65
  • 第一个数字(上面的 1)= 公司编号(位置 1-5,前面的空白)
  • IN 或 UT = IN 用于打卡,UT 用于打卡(位置 6-7)
  • 20071001 = 日期(营业日期),格式为 YYYYMMDD(位置 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 可以帮助我完成格式化吗?

【问题讨论】:

    标签: oracle select concatenation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您还可以使用rpad and lpad 来填充您的输出并截断多余的字符

      【讨论】:

        【解决方案3】:

        超级甜,你们拯救了我的周末! :)

        查询:

        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 列的“公司编号”有什么关系,以及如何锁定 timecardpost 以防篡改,但这可以等到星期一。

        非常感谢! / 彼得

        【讨论】:

          猜你喜欢
          • 2013-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多