source

Oracle SQL을 사용하여 요일 번호와 요일을 어떻게 출력합니까?

nicesource 2023. 7. 23. 14:23
반응형

Oracle SQL을 사용하여 요일 번호와 요일을 어떻게 출력합니까?

Oracle SQL을 사용하여 다음에 대한 결과 집합을 생성하는 방법은 무엇입니까?

  • 요일 번호(1-7)
  • 요일 이름(월요일, 화요일, 수요일 등)

예:

요일 이름1 월요일2 화요일3 수요일4 목요일5 금요일6 토요일7 일요일

플로린의 대답은 내가 어떻게 할 것인가인데, 당신은 NLS 설정에 대해 조금 조심할 필요가 있습니다.요일은 NLS 영토의 영향을 받기 때문에 미국에 있는 것처럼 실행하면 다음과 같이 작동합니다.

alter session set nls_territory = 'AMERICA';

select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual;

D DAY
- ------------------------------------
6 Friday

select level as dow,
    to_char(trunc(sysdate ,'D') + level, 'Day') as day
from dual
connect by level <= 7;

DOW DAY
--- ------------------------------------
  1 Monday
  2 Tuesday
  3 Wednesday
  4 Thursday
  5 Friday
  6 Saturday
  7 Sunday

그러나 영국에서 동일한 쿼리 실행은 하루 휴가입니다.

alter session set nls_territory = 'UNITED KINGDOM';

select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual;

D DAY
- ------------------------------------
5 Friday

select level as dow,
    to_char(trunc(sysdate ,'D') + level, 'Day') as day
from dual
connect by level <= 7;

DOW DAY
--- ------------------------------------
  1 Tuesday
  2 Wednesday
  3 Thursday
  4 Friday
  5 Saturday
  6 Sunday
  7 Monday

계산을 조정하여 수정해야 합니다.

select level as dow,
    to_char(trunc(sysdate ,'D') + level - 1, 'Day') as day
from dual
connect by level <= 7;

DOW DAY
--- ------------------------------------
  1 Monday
  2 Tuesday
  3 Wednesday
  4 Thursday
  5 Friday
  6 Saturday
  7 Sunday

다음과 같은 경우 일 이름에 사용되는 언어를 별도로 지정할 수도 있습니다.

select level as dow,
    to_char(trunc(sysdate ,'day') + level - 1, 'Day',
        'NLS_DATE_LANGUAGE=FRENCH') as day
from dual
connect by level <= 7;

DOW DAY
--- --------------------------------
  1 Lundi
  2 Mardi
  3 Mercredi
  4 Jeudi
  5 Vendredi
  6 Samedi
  7 Dimanche

글로벌화 지원 가이드에 포함된 요일 및 날짜대한 문서.

날짜에서 날짜 번호를 가져오려고 할 때, 당신은 다음과 같은 문제를 피할 수 있습니다.NLS_TERRITORY설정사용 시 상승TO_CHAR(dt, 'D')대신 요일을 ISO 주간(항상 월요일 자정)의 시작과 비교합니다.

SELECT TRUNC(SYSDATE) - TRUNC(SYSDATE, 'IW') + 1 AS day_number,
       TO_CHAR(SYSDATE, 'fmDAY') AS day
FROM   DUAL;

출력 대상:

일_숫자 데이
5 금요일.

참고: 사용할 수도 있습니다.fmDAY일 이름에서 후행 공백을 자동으로 제거합니다.사용하는 경우DAY(없이)fm수식어) 그러면 모든 요일 이름이 동일한 길이로 패딩될 것입니다; 영어의 경우 그것은Friday 와 같은 길이로 오른쪽으로 이동합니다.Wednesday.


ISO 주를 사용하는 것과 사용하는 것 비교TO_CHAR:

ALTER SESSION SET NLS_TERRITORY = 'GERMANY';

SELECT TO_CHAR(SYSDATE, 'D') AS dn_tochar
       TRUNC(SYSDATE) - TRUNC(SYSDATE, 'IW') + 1 AS dn_isoweek
FROM   DUAL

출력:

DN_TOCHAR DN_ISOWeek
5 5

좋은 것은 오라클이 독일의 한 주가 월요일에 시작하기 때문에 금요일이 한 주의 다섯 번째 날이라고 생각하기 때문입니다.

하지만 다른 영역에서 동일한 쿼리가 발생했습니다.

ALTER SESSION SET NLS_TERRITORY = 'BANGLADESH';

SELECT TO_CHAR(SYSDATE, 'D') AS dn_tochar
       TRUNC(SYSDATE) - TRUNC(SYSDATE, 'IW') + 1 AS dn_isoweek
FROM   DUAL

출력:

DN_TOCHAR DN_ISOWeek
1 5

그리고 그것에 대해 동일한 대답을 하지 않습니다.TO_CHAROracle이 방글라데시의 한 주가 금요일에 시작되므로 주의 첫 번째 날이 될 것으로 간주하는 버전입니다.

마찬가지로, 다른 나라들 중에서, 이집트의 주는 토요일에 시작하고 미국의 주는 일요일에 시작하기 때문에, 만약 당신이 사용한다면, 그들의 모든 가치는 무효가 될 것입니다.TO_CHAR하지만 ISO 주간을 사용한다면 그렇지 않습니다.


그러나 요일별로 7개의 행만 생성하려는 경우 문제를 단순화하고 계층 쿼리를 사용하여 요일 번호를 생성한 다음 ISO 주의 시작부터 날짜를 오프셋할 수 있습니다.

SELECT LEVEL AS day_number,
       TO_CHAR(
         TRUNC(SYSDATE, 'IW') + LEVEL - 1,
         'fmDAY',
         'NLS_DATE_LANGUAGE=English'
       ) AS day
FROM   DUAL
CONNECT BY LEVEL <= 7;

항상 출력되는 항목:

일_숫자 데이
1 월요일.
2 화요일.
3 수요일
4 목요일.
5 금요일.
6 토요일
7 일요일.

db<>여기로 이동

select level as dow, 
    to_char(level+trunc(sysdate,'D'),'Day') as day
from dual
connect by level <= 7;

다른 세션 없음

 CASE 
    WHEN to_char(sysdate, 'd')-1 = 0 THEN 7 
    ELSE to_char(sysdate, 'd')-1 
 END 
Select 1, 'Monday' from dual union all select 2, 'Tuesday' from dual ...

언급URL : https://stackoverflow.com/questions/14517761/using-oracle-sql-how-does-one-output-day-number-of-week-and-day-of-week

반응형