0

The current query only displays the current pay period we are in. I am tasked with getting the previous period as well. I can't figure out what would be the best way to filter it in after the prompt.

SELECT Table__1."WORK_CENTER",
  Table__1."WORK_DATE",
  Table__1."AFE",
  Table__1."PAYCODE",
  Table__1."PERSONNEL_NUMBER",
  Table__1."REPORTED_HOURS",
  Table__1."REPORTED_MINS",
  Table__1."PERSONNEL_NUMBER",
  Table__1."POSITION_NUMBER",
  Table__1."MILES",
(
    case
      when dayofmonth(current_date) <= 15 then (ADD_MONTHS(NEXT_DAY(LAST_DAY(CURRENT_DATE)), -1))
      else (
        ADD_DAYS (
          TO_DATE ((LAST_DAY(CURRENT_DATE)), 'YYYY-MM-DD'),
          (
            CASE
              WHEN Month(current_date) IN (4, 6, 9, 11) THEN -14
              WHEN Month(current_date) IN (1, 3, 5, 7, 8, 10, 12) THEN -15
              ELSE -12
            END
          )
        )
      )
    end
  ) as "begin_dt",
(
    case
      when dayofmonth(current_date) <= 15 then (
        ADD_DAYS (
          TO_DATE ((LAST_DAY(CURRENT_DATE)), 'YYYY-MM-DD'),
          (
            CASE
              WHEN Month(current_date) IN (4, 6, 9, 11) THEN -14
              WHEN Month(current_date) IN (1, 3, 5, 7, 8, 10, 12) THEN -15
              ELSE -12
            END
          )
        )
      )
      else (LAST_DAY(CURRENT_DATE))
    end
  ) as "end_dt"
FROM  Table__1
WHERE Table__1."WORK_CENTER" = @Prompt('enter prompt', 'A',,,)
  AND Table__1."WORK_DATE" >= (
    case
      when dayofmonth(current_date) <= 15 then (ADD_MONTHS(NEXT_DAY(LAST_DAY(CURRENT_DATE)), -1))
      else (
        ADD_DAYS (
          TO_DATE ((LAST_DAY(CURRENT_DATE)), 'YYYY-MM-DD'),
          (
            CASE
              WHEN Month(current_date) IN (4, 6, 9, 11) THEN -14
              WHEN Month(current_date) IN (1, 3, 5, 7, 8, 10, 12) THEN -15
              ELSE -12
            END
          )
        )
      )
    end
  )
  AND Table__1."WORK_DATE" < (
    case
      when dayofmonth(current_date) <= 15 then (
        ADD_DAYS (
          TO_DATE ((LAST_DAY(CURRENT_DATE)), 'YYYY-MM-DD'),
          (
            CASE
              WHEN Month(current_date) IN (4, 6, 9, 11) THEN -14
              WHEN Month(current_date) IN (1, 3, 5, 7, 8, 10, 12) THEN -15
              ELSE -12
            END
          )
        )
      )
      else (LAST_DAY(CURRENT_DATE))
    end
  )
order by WORK_DATE

any thoughts? I feel it would be better to do the filtering within rather than run a second query against it.

  • Please provide some sample data and expected result. – d r Jul 08 '22 at 11:35
  • @dr Work Date will = 1st of the current month till month end row by row, Begin Date = 2022-07-01 End Date = 2022-07-16 (July hast 31 days). Once past day 15 Begin Date = 2022-07-16 and End Date = 2022-07-31. The work date is the issue. I can't figure out how to show the previous pay period range in the work date column without having some thing to compare against. – ohsapman96 Jul 11 '22 at 15:29

1 Answers1

0

WITH clause is here just as a try to simulate some sample data and, as such, it is not a part of the answer. I must addmit that I didn't understand the question as there are no sample data and no expected result. Maybe I'm wrong but it seems to me that you want some starting end ending dates of a halfmonthly period for a given WORK_DATE. If so, maybe this could help you find a solution. I added same starting and ending dates for previous and next month too. Sintax is Oracle. Regards...

WITH 
    tbl AS
        (
            Select 
                'WC_1' "WORK_CENTER", '17-JUN-2022' "WORK_DATE", 'Afe_1 - whatever it is' "AFE", 'XXX' "PAYCODE", 101 "PERSONNEL_NUMBER",
                8 "REPORTED_HOURS", 12 "REPORTED_MINS", 10101 "POSITION_NUMBER", 900 "MILES"
            From Dual UNION ALL
            Select 
                'WC_1' "WORK_CENTER", '12-JUL-2022' "WORK_DATE", 'Afe_2 - whatever it is' "AFE", 'YYY' "PAYCODE", 201 "PERSONNEL_NUMBER",
                6 "REPORTED_HOURS", 45 "REPORTED_MINS", 20102 "POSITION_NUMBER", 630 "MILES"
            From Dual UNION ALL
            Select 
                'WC_1' "WORK_CENTER", '22-JUL-2022' "WORK_DATE", 'Afe_3 - whatever it is' "AFE", 'ZZZ' "PAYCODE", 301 "PERSONNEL_NUMBER",
                7 "REPORTED_HOURS", 30 "REPORTED_MINS", 30103 "POSITION_NUMBER", 320 "MILES"
            From Dual
        )


SELECT t.WORK_CENTER,
  t.WORK_DATE,
  CASE 
      WHEN t.WORK_DATE Between ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 1 And ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 15 THEN ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 1
      WHEN t.WORK_DATE Between ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 16 And LAST_DAY(t.WORK_DATE) THEN ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 16
  END "START_DATE",
  CASE 
      WHEN t.WORK_DATE Between ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 1 And ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 15 THEN ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 15
      WHEN t.WORK_DATE Between ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 16 And LAST_DAY(t.WORK_DATE) THEN LAST_DAY(t.WORK_DATE)
  END "END_DATE",
--
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 1 "START_FST_HLF_WRK_MNTH",
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 15 "END_FST_HLF_WRK_MNTH",
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) + 16 "START_SCND_HLF_WRK_MNTH",
  LAST_DAY(t.WORK_DATE) "END_SCND_HLF_WRK_MNTH",
--
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), -2) + 1 "START_FST_HLF_PREV_MNTH",
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), -2) + 15 "END_FST_HLF_PREV_MNTH",
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), -2) + 16 "START_SCND_HLF_PREV_MNTH",
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), -1) "END_SCND_HLF_PREV_MNTH",
--
  LAST_DAY(t.WORK_DATE) + 1 "START_FST_HLF_NXT_MNTH",
  LAST_DAY(t.WORK_DATE) + 15 "END_FST_HLF_NXT_MNTH",
  LAST_DAY(t.WORK_DATE) + 16 "START_SCND_HLF_NXT_MNTH",
  ADD_MONTHS(LAST_DAY(t.WORK_DATE), 1) "END_SCND_HLF_NXT_MNTH"
From 
    tbl t 
WHERE
    t.WORK_CENTER = &WorkCenter
ORDER BY
    t.WORK_DATE

--  
--  R e s u l t
--
--  WORK_CENTER WORK_DATE   START_DATE END_DATE  START_FST_HLF_WRK_MNTH END_FST_HLF_WRK_MNTH START_SCND_HLF_WRK_MNTH END_SCND_HLF_WRK_MNTH START_FST_HLF_PREV_MNTH END_FST_HLF_PREV_MNTH START_SCND_HLF_PREV_MNTH END_SCND_HLF_PREV_MNTH START_FST_HLF_NXT_MNTH END_FST_HLF_NXT_MNTH START_SCND_HLF_NXT_MNTH END_SCND_HLF_NXT_MNTH
--  ----------- ----------- ---------- --------- ---------------------- -------------------- ----------------------- --------------------- ----------------------- --------------------- ------------------------ ---------------------- ---------------------- -------------------- ----------------------- ---------------------
--  WC_1        12-JUL-2022 01-JUL-22  15-JUL-22 01-JUL-22              15-JUL-22            16-JUL-22               31-JUL-22             01-JUN-22               15-JUN-22             16-JUN-22                30-JUN-22              01-AUG-22              15-AUG-22            16-AUG-22               31-AUG-22             
--  WC_1        17-JUN-2022 16-JUN-22  30-JUN-22 01-JUN-22              15-JUN-22            16-JUN-22               30-JUN-22             01-MAY-22               15-MAY-22             16-MAY-22                31-MAY-22              01-JUL-22              15-JUL-22            16-JUL-22               31-JUL-22             
--  WC_1        22-JUL-2022 16-JUL-22  31-JUL-22 01-JUL-22              15-JUL-22            16-JUL-22               31-JUL-22             01-JUN-22               15-JUN-22             16-JUN-22                30-JUN-22              01-AUG-22              15-AUG-22            16-AUG-22               31-AUG-22            
d r
  • 3,848
  • 2
  • 4
  • 15
  • I do believe this would take care of what I am looking for thank you so much! God bless you! – ohsapman96 Jul 21 '22 at 19:02
  • @ohsapman96, You are wellcome. If it works for you feel free to accept it or vote up for it. I 'm sure you will manage to fill in the gaps following the code in the answer. Regards... – d r Jul 21 '22 at 19:21