2008-11-28 4 views
3

У меня возникла проблема с форматированием данных при выполнении запроса в базу данных Oracle.Форматирование запросов Oracle DB

Что я хочу сделать, это экспортировать некоторые данные в формат ниже в текстовый файл;

1IN20071001  40005601054910101200   1 65 
  • Первый номер (1 выше) = номер компании (позиция 1-5, заготовки Infront)
  • В или UT = IN для clockin и UT для clockout (позиция 6-7)
  • 20071001 = дата (дата бизнеса) в формате YYYYMMDD (поз 8-15)
  • 400056010549 = EmployeeID (поз 16-33, выравнивание по правому краю, заготовки Infront)
  • 101012 = Время в формате TTMMSS (поз 34-39)
  • 00 = FT, всегда 00 (позиция 40-41)
  • Заготовки = всегда 8 пустых мест (позиция 42-49)
  • 1 = Не знаю, для чего это используется, но всегда должно быть 1 (позиция 50 , выравнивание по правому краю заготовки, Infront)
  • 65 = «Kostnadsställe», ENT_HR_EMPLOYEE.USERALPHA6 (поз 51-55, выравнивание по правому краю заготовки, Infront)

в настоящее время я использую ниже запрос, но это, где мои знания 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, который может помочь мне закончить форматирование?

ответ

2

если t.clockindatetime является оракул DATE, то почему бы не использовать:
TO_CHAR(t.clockindatetime, 'YYYYMMDD') для части даты и TO_CHAR(t.clockindatetime, 'HHMISS') для части времени (если вы хотите часы, чтобы быть в 24hr использовании формата TO_CHAR(t.clockindatetime, 'HH24MISS') (часы будут еще только занимают 2 символа))

2

Также вы можете использовать rpad and lpad как для прокладки вашего выхода и усечение дополнительных символов

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 и как заблокировать timecardpost для подделки, но это может подождать до понедельника.

Большое спасибо! /Petter

+0

Хороший материал, Петтер, он выглядит намного читабельнее – hamishmcn 2008-11-29 20:01:08

Смежные вопросы