Oracle DB форматирование запросов - PullRequest
3 голосов
/ 28 ноября 2008

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

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

    1IN20071001      40005601054910101200            1   65
  • Первый номер (1 выше) = номер компании (позиция 1-5, пробел в начале)
  • IN или UT = IN для тактового входа и UT для тактового отключения (позиции 6-7)
  • 20071001 = Дата (рабочая дата) в формате ГГГГММДД (позиции 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, который может помочь мне закончить форматирование?

Ответы [ 3 ]

2 голосов
/ 28 ноября 2008

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

2 голосов
/ 28 ноября 2008

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

1 голос
/ 29 ноября 2008

Супер мило, вы, ребята, спасли мои выходные! :)

Запрос:

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

Большое спасибо! / Петтер

...