在对Oracle数据库进行查询时,我遇到了格式化数据的问题。
我想要做的是将一些数据导出到下面的格式文本文件中;
1IN20071001 40005601054910101200 1 65
目前我正在使用下面的查询,但这是我的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?
答案 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列的“公司编号”以及如何锁定时间信息卡以进行篡改,但是可以等到星期一。
非常感谢! /彼得