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
'source' 카테고리의 다른 글
| 하위 쿼리의 문자열을 MySQL의 단일 행으로 연결하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
|---|---|
| 웹어셈블리로 컴파일된 러스트 라이브러리에서 C 라이브러리를 사용하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
| S3 버킷에서 모든 파일을 다운로드하는 Boto3 (0) | 2023.07.23 |
| 장고 마이그레이션: 테이블을 만들지 않습니다. (0) | 2023.07.23 |
| 시간 데이터가 형식과 일치하지 않음 (0) | 2023.07.23 |