sql >> Database teknologi >  >> RDS >> Oracle

SQL arbejdsuge i Oracle

Til dit krav skal du bruge en kombination af IW og WW format. Du kan kombinere dem ved hjælp af en CASE udtryk.

Hvis du vil generere listen over datoer for hele året, kan du bruge rækkegenerator metode.

SQL> WITH sample_data AS(
  2  SELECT DATE '2015-12-28'    + LEVEL -1 dt FROM dual
  3  CONNECT BY LEVEL <= 15
  4  )
  5  -- end of sample_data mimicking real table
  6  SELECT dt,
  7    TO_CHAR(dt, 'DY') DAY,
  8    NVL(
  9    CASE
 10      WHEN dt < DATE '2016-01-01'
 11      THEN TO_CHAR(dt, 'IW')
 12      WHEN dt >= next_day(TRUNC(DATE '2016-01-01', 'YYYY') - 1, 'Monday')
 13      THEN TO_CHAR(dt                                      +7, 'IW')
 14    END, '01') week_number
 15  FROM sample_data;

DT         DAY WEEK_NUMBER
---------- --- -----------
2015-12-28 MON 53
2015-12-29 TUE 53
2015-12-30 WED 53
2015-12-31 THU 53
2016-01-01 FRI 01
2016-01-02 SAT 01
2016-01-03 SUN 01
2016-01-04 MON 02
2016-01-05 TUE 02
2016-01-06 WED 02
2016-01-07 THU 02
2016-01-08 FRI 02
2016-01-09 SAT 02
2016-01-10 SUN 02
2016-01-11 MON 03

15 rows selected.

BEMÆRK:

Værdien 15 til at generere 15 rækker, og datoerne er hårdkodet ovenfor kun til demonstration ved hjælp af WITH-sætningen, da OP ikke forsynede testcasen med oprette og indsætte sætninger. I virkeligheden skal du bruge dine tabel- og kolonnenavne.



  1. Indkodning af SQL_Latin1_General_CP1_CI_AS til UTF-8

  2. Gem flere rækker fra mysql-databasen i en enkelt variabel

  3. Hvordan til venstre slutte sig til flere en til mange borde i mysql?

  4. hvordan man eksporterer output i et CSV-format gennem en procedure