2012-12-01 25 views
7

Nếu tôi viếtSắp xếp theo ngày trong tuần từ thứ hai đến chủ nhật

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

Sau đó, nó sắp xếp các kết quả dựa trên ngày thích; từ Thứ Sáu, sau đó Thứ Hai và Thứ Tư tuần trước, như sắp xếp theo ký tự.

Nhưng tôi muốn sắp xếp theo ngày trong tuần; từ thứ Hai đến chủ nhật.

Trả lời

3

Hãy xem các định dạng khác cho TO_CHAR. Thay vì 'fmDay' sử dụng 'D' và nó sẽ cho bạn ngày trong tuần từ 1 đến 7. Sau đó, bạn có thể dễ dàng sắp xếp trên đó.

Dưới đây là danh sách các định dạng ngày: http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm

+0

đây là ngày bắt đầu với chủ nhật. –

4

Bạn đang nhận được nó theo thứ tự bạn là bởi vì bạn đang đặt hàng bởi một chuỗi (và điều này sẽ không làm việc vì bạn không chọn từ bất cứ điều gì) .

Bạn có thể đặt hàng theo số format model được sử dụng để tạo ngày trong tuần ở dạng số, D, nhưng chủ nhật là 1 trong số này tôi khuyên bạn nên sử dụng mod() để thực hiện công việc này.

ví dụ: giả sử bảng

create table a (b date); 

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

này sẽ làm việc:

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) 

Dưới đây là một SQL Fiddle để chứng minh.

Trong trường hợp của bạn truy vấn của bạn sẽ trở thành:

select ename, to_char(hiredate,'fmDay') as "Day" 
    from my_table 
order by mod(to_char(hiredate, 'D') + 5, 7) 
1

Tại sao làm phức tạp khi bạn có thể thêm cột khác với những con số 1-7 tương ứng với ngày và sau đó sắp xếp theo cột này ...

0

tôi chỉ gặp phải yêu cầu tương tự - để đặt hàng kết quả truy vấn theo ngày trong tuần, nhưng không bắt đầu với Chủ nhật. Tôi đã sử dụng truy vấn sau đây trong Oracle để bắt đầu w/thứ hai. (Sửa đổi nó để bắt đầu thứ tự w/bất kỳ ngày nào trong tuần, ví dụ: thay đổi 'MONDAY' thành 'TUESDAY'.)

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

Hoặc:

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

CHỌN * TỪ lớp ORDER BY TRƯỜNG HỢP KHI ngày = 'Sunday' THEN 1 KHI ngày = 'Monday' THEN 2 KHI ngày = 'Thứ ba' THEN 3 KHI NGÀY = 'Thứ tư' THEN 4 KHI NGÀY = 'Thứ năm' THEN 5 KHI NGÀY = 'Thứ sáu' THEN 6 KHI ngày = 'Saturday' THEN 7 END ASC

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

giả định người dùng có một bảng gọi là lớp học trong đó sử dụng bảng đã class_id (khóa chính), tên lớp, ngày

Các vấn đề liên quan