programing

월요일부터 일요일까지 요일별로 정렬

itmemos 2023. 7. 16. 12:47
반응형

월요일부터 일요일까지 요일별로 정렬

내가 쓴다면,

select ename, to_char(hiredate,'fmDay') as "Day" order by "Day";

그런 다음 문자별로 정렬하는 것처럼 금요일, 월요일 및 마지막 수요일을 기준으로 결과를 정렬합니다.

하지만 월요일부터 일요일까지 요일별로 분류하고 싶습니다.

문자열로 주문하기 때문에 현재의 순서대로 주문할 수 있습니다(아무것도 선택하지 않기 때문에 작동하지 않습니다).

숫자 형식으로 요일을 만드는 데 사용된 형식 모델로 주문할 수 있습니다.D이 1일이기 는 일일만이요 1이기때사문용것다추니천합을하는하지에일▁using다▁but▁▁recommend▁as▁sunday▁in니추를 사용하는 것을 사용하는 것을 추천합니다.mod()이 일을 성공시키기 위해.

즉, 식탁에 앉기

create table a ( b date );

insert into a
 select sysdate - level
  from dual
connect by level <= 7;

이렇게 하면 됩니다.

select mod(to_char(b, 'D') + 5, 7) as dd, to_char(b, 'DAY')
  from a
 order by mod(to_char(b, 'D') + 5, 7)

여기에 시연할 SQL Fiddle이 있습니다.

이 경우 질문은 다음과 같습니다.

select ename, to_char(hiredate,'fmDay') as "Day" 
  from my_table
 order by mod(to_char(hiredate, 'D') + 5, 7)
SELECT
     *
FROM
     classes
ORDER BY 
     CASE
          WHEN Day = 'Sunday' THEN 1
          WHEN Day = 'Monday' THEN 2
          WHEN Day = 'Tuesday' THEN 3
          WHEN Day = 'Wednesday' THEN 4
          WHEN Day = 'Thursday' THEN 5
          WHEN Day = 'Friday' THEN 6
          WHEN Day = 'Saturday' THEN 7
     END ASC

사용자가 해당 테이블에 클래스라는 테이블이 있다고 가정하면 사용자는 class_id(기본 키), 클래스 이름, 일을 가집니다.

다을위 형확인식른의 다른 .TO_CHAR'부터 7시까지 'fmDay' 'D'는 1시부터 7시까지입니다.그러면 쉽게 분류할 수 있습니다.

다음은 날짜 형식 목록입니다. http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm

날짜에 해당하는 숫자 1-7의 다른 열을 추가한 다음 이 열로 정렬할 수 있는 경우를 복잡하게 만드는 이유...

방금 같은 요구 사항이 발생했습니다. 요일별로 쿼리 결과를 주문해야 하지만 일요일로 시작하지는 않습니다.Oracle에서 다음 쿼리를 사용하여 월요일부터 시작했습니다. (주중 아무 요일이나 주문을 시작하도록 수정합니다. 예를 들어 'MONDAY'를 'DUSTUDAY'로 변경합니다.)

SELECT ename, to_char(hiredate, 'fmDAY') AS "Day" 
FROM emp
ORDER BY (next_day(hiredate, 'MONDAY') - hiredate) DESC

또는:

SELECT ename, to_char(hiredate, 'fmDAY') AS "Day"
FROM emp
ORDER BY (hiredate - next_day(hiredate, 'MONDAY'))

D: 의형마크스to_char값으로 . 에서는 1-7을 사용합니다.

하지만!

이 출력은 NLS_TERRORITY에 대한 클라이언트 설정에 따라 달라집니다.미국은 일요일을 첫째 날로 생각합니다.세계의 대부분은 월요일을 시작으로 생각하고 있습니다.

alter session set nls_territory = AMERICA;

with dts as (
  select date'2018-01-01' + level - 1 dt 
  from   dual
  connect by level <= 7
)
select to_char ( dt, 'Day' ) day_name,
       to_char ( dt, 'd' ) day_number
from   dts
order  by day_number;

DAY_NAME    DAY_NUMBER   
Sunday       1             
Monday       2             
Tuesday      3             
Wednesday    4             
Thursday     5             
Friday       6             
Saturday     7  

alter session set nls_territory = "UNITED KINGDOM";

with dts as (
  select date'2018-01-01' + level - 1 dt 
  from   dual
  connect by level <= 7
)
select to_char ( dt, 'Day' ) day_name,
       to_char ( dt, 'd' ) day_number
from   dts
order  by day_number;

DAY_NAME    DAY_NUMBER   
Monday       1             
Tuesday      2             
Wednesday    3             
Thursday     4             
Friday       5             
Saturday     6             
Sunday       7

다른 NLS 변수와 의 세 변수로 NLS_TERRORITY를 수 .to_char:

with dts as (
  select date'2018-01-01' dt 
  from   dual
)
select to_char ( dt, 'Day', 'NLS_DATE_LANGUAGE = SPANISH' ) day_name
from   dts;

DAY_NAME    
Lunes  

with dts as (
  select date'2018-01-01' dt 
  from   dual
)
select to_char ( dt, 'Day', 'NLS_TERRITORY = AMERICA' ) day_name
from   dts;

ORA-12702: invalid NLS parameter string used in SQL function

따라서 사용하는 모든 솔루션은D정렬은 버그입니다!

이 문제를 방지하려면 날짜에서 가장 최근의 월요일(오늘이 월요일인 경우 가장 최근의 월요일 = 오늘)을 뺍니다.은 이것을 을수수다있니습으로 할 수.IW합니다.ISO 주의 시작을 반환합니다.항상 월요일인 경우:

with dts as (
  select date'2018-01-01' + level - 1 dt 
  from   dual
  connect by level <= 7
)
select to_char ( dt, 'Day' ) day_name,
       ( dt - trunc ( dt, 'iw' ) ) day_number
from   dts
order  by day_number;

DAY_NAME    DAY_NUMBER   
Monday                   0 
Tuesday                  1 
Wednesday                2 
Thursday                 3 
Friday                   4 
Saturday                 5 
Sunday                   6 

일요일-토요일 정렬의 경우 ISO 주의 시작을 찾기 전 날짜에 하나를 추가합니다.

with dts as (
  select date'2018-01-01' + level - 1 dt 
  from   dual
  connect by level <= 7
)
select to_char ( dt, 'Day' ) day_name,
       ( dt - trunc ( dt + 1, 'iw' ) ) day_number
from   dts
order  by day_number;

DAY_NAME    DAY_NUMBER   
Sunday                  -1 
Monday                   0 
Tuesday                  1 
Wednesday                2 
Thursday                 3 
Friday                   4 
Saturday                 5 

월요일을 항상 첫 번째 요일로 처리하려면 다음을 사용할 수 있습니다.

-- Not affected by NLS_TERRITORY
-- ALTER SESSION SET NLS_TERRITORY="AMERICA";  -- Sunday is first day of week
-- ALTER SESSION SET NLS_TERRITORY="GERMANY";  -- Monday is first day of week

SELECT *
FROM tab
ORDER BY 1+TRUNC(dt)-TRUNC(dt,'IW');

db<>디플 데모

간단합니다.

SELECT last_name, hire_date,TO_CHAR(hire_date, 'DAY') DAY
FROM employees
ORDER BY TO_CHAR(hire_date - 1, 'd');

TO_CHAR(hire_date - 1, 'd')는 'Sunday'라는 이름의 상자에 'Monday'를 넣습니다.

다음과 같은 기능이 있습니다.

SELECT *
FROM table
ORDER BY WEEKDAY(table.date);

답변 게시가 늦어질 수 있지만 월요일부터 요일별로 정렬하는 간단한 해결책인 것 같습니다.

select hiredate,dayname(hiredate) from emp order by (dayofweek(hiredate)+5)%7; 

5를 추가한 이유에 대한 답은 무엇입니까?

왜냐하면, 숫자에서 일요일은 값이 1이고, 월요일은 값이 2이고... 그리고 토요일은 값이 7입니다.

따라서 월요일부터 2 + 5 = 7 및 7을 갖는 mod(%)는 새로운 값을 제공합니다.

이 숫자를 다른 요일로 시작하도록 변경할 수 있습니다.

2nd option 

simply use WEEKDAY() function return weekday number for a given date.
**Note:**
0 = monday
1 = tuesday
2 = wednesday
3 = thursday
4 = friday
5 = saturday
6 = sunday

select hiredate,dayname(hiredate) from emp order by WEEKDAY(hiredate);

저는 0이 아닌 1부터 시작하는 결과를 당신에게 줌으로써 벤의 답변을 개선했습니다.쿼리는 다음과 같습니다.

select 
    mod(to_char(b, 'D')+ 5, 7) +1 as dd, 
    to_char(b, 'DAY')
from a
order by mod(to_char(b, 'D')+ 5, 7);

한편, 한 주를 일요일부터 시작하려면 다음 쿼리를 사용해야 합니다.

select 
    mod(to_char(b, 'D')+ 6, 7) +1 as dd, 
    to_char(b, 'DAY')
from a
order by mod(to_char(b, 'D')+ 6, 7)

이것이 도움이 되길 바랍니다 :)

with s as (select trunc(sysdate) + level dt from dual connect by level <= 7)
select to_char(dt, 'fmDay', 'nls_date_language=English') d
from s
order by dt - trunc(dt, 'iw');

D                                   
------------------------------------
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

7 rows selected. 

마음에 드셨으면 하는 간단한 아이디어가 있습니다. 어떤 sql을 사용하는지 모르니 구문 오류를 수정해 주세요.

select ename, to_char(hiredate,'fmDay') as "Day" from ABC_TABLE
JOIN (VALUES (1,'Monday'),(2,'Tuesday'),(3,'Wednesday'),(4,'Thursday'),(5,'Friday'),(6,'Saturday'),(7,'Sunday')) weekdays(seq,[Days]) on
ABC_TABLE.to_char(hiredate,'fmDay') = weekdays.[Days]
order by weekdays.seq;

저는 당신이 다음 주에 시작하고 일주일이 지난 후에 분기를 찾아서 클로스 순으로 추가하기를 원합니다.

검색(MSSQL과 같이 입력(MSSQL):select DatePart(QUARTER, cast(cast(mydate as char(8)) as date))

이렇게 하면 sql에서 유용합니다.

ORDER BY 
     CASE DATENAME(dw,<<enter your date variable here>>)
          WHEN 'Monday' THEN 1
          WHEN 'Tuesday' THEN 2
          WHEN 'Wednesday' THEN 3
          WHEN 'Thursday' THEN 4 
          WHEN 'Friday' THEN 5 
          WHEN 'Saturday' THEN 6
          WHEN 'Sunday' Then 7
     END ASC;

물론 다른 순서를 원하시면 그 이후에 값을 바꾸시면 됩니다.

의 경우, Postgres의 경우을일의월항상첫째날사다다용니합음을면려지하정로요▁post▁for다를 사용합니다.TO_CHAR(b, 'ID')ISO 8601 요일(월요일 (1)에서 일요일 (7)로 되돌립니다.

이것은 국제 표준(ISO)의 요일이므로 'ID'의 D 앞에 I가 표시됩니다.

https://www.postgresqltutorial.com/postgresql-to_char/

너무 늦었다고 생각합니다만, 다른 분들이 필요하시면 여기에 두고 가겠습니다.

요일별로 주문만 가능하지만 세션 영역에 따라 다릅니다.

영역을 표시하려면 다음 쿼리를 실행하면 됩니다.

SELECT * FROM V$NLS_PARAMETERS WHERE parameter = 'NLS_TERRITORY';

NLS_TERRITORY요일 및 주 번호 지정 규칙을 따를 영역의 이름을 지정합니다.

질문으로 "" " " " " " " "가 있으면 다시 시작합니다.AMERICA값으로 월요일은 2입니다.

월요일부터 일요일까지 결과를 주문하려면 적어도 두 가지 경로가 있습니다.

- 1 - ▁onehire_date:

SELECT * FROM employees ORDER BY TO_CHAR(hire_date - 1, 'd');

2 - 영역을 월요일의 값으로 1을 포함하는 값으로 변경합니다. 예를 들어,FRANCE:

ALTER SESSION SET NLS_TERRITORY = 'FRANCE';

SELECT * FROM employees ORDER BY TO_CHAR(hire_date, 'd');

이게 제 해결책입니다.

select ename, to_char(hiredate,'fmDay') "Day"
from employees
order by DECODE(to_number(to_char(hiredate ,'D'))-1,
                                                0, 7,
                to_number(to_char(hiredate ,'D'))-1);

기본적으로 'D' 형식을 to_char 함수로 사용하여 날짜를 숫자로 변환합니다.

to_number(to_char(hire_date ,'D')

하지만 그렇게 되면 일요일은 1일, 월요일은 2일 등이 되기 때문에 1을 빼고 월요일을 1로 만듭니다.

(to_number(to_char(hire_date ,'D') - 1

그런 다음 DECODE 기능을 사용하여 기본적으로 0이면 7이면 원래 숫자라고 말합니다.그러면 일요일이 0이 아니라 7이 되고 다른 모든 것이 적절한 위치에 있게 됩니다(월요일은 1, 화요일은 2... 곧).

DECODE(to_number(to_char(hire_date ,'D'))-1,
                                                0, 7,
                to_number(to_char(hire_date ,'D'))-1);

언급URL : https://stackoverflow.com/questions/13662451/sort-by-day-of-the-week-from-monday-to-sunday

반응형