2010-08-10 15 views
12

Đây có phải là cách tốt nhất để xác định xem ngày của Oracle có vào cuối tuần không?Xác định xem ngày của Oracle có vào cuối tuần không?

select * from mytable 
where 
TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN'); 
+1

Trên thực tế cuối tuần không phải là thứ bảy/Chủ nhật ở tất cả các quốc gia, một số ít (20-30) quốc gia có tuần kết thúc vào các ngày khác nhau (nguồn: en.wikipedia.org/wiki/Workweek_and_weekend) –

Trả lời

22

Kể từ Oracle 11g, có. Các chỉ khu vực khả thi thay thế bất khả tri mà tôi đã nhìn thấy như sau:

SELECT * 
FROM mytable 
WHERE MOD(TO_CHAR(my_date, 'J'), 7) + 1 IN (6, 7); 
+0

Tại sao ngày Julian thực sự hoạt động? –

+1

@ Michael-O - vì ngày Julian về cơ bản là số ngày kể từ thời điểm bạn đã biết, bạn có thể sử dụng toán cơ bản để xác định xem có phải là cuối tuần hay không, vì bạn đã biết ngày nào trong tuần 1 là. Vì các lịch khác có độ dài tháng khác nhau, độ dài năm, ngày nhuận và năm nhuận, khó có thể lấy được thông tin về ngày trong tuần cho các lịch khác, được cung cấp một ngày để làm việc. – ninesided

4

Không phải là câu trả lời cho câu hỏi. Nhưng một số thông tin khác. Có nhiều thủ thuật SQL hơn với ngày tháng.

to_char(sysdate, 'd') --- day of a week, 1,2,3 .. to 7 
to_char(sysdate, 'dd') --- day of a month, 1,2,3 .. to 30 or 31 
to_char(sysdate, 'ddd') --- day of a year, 1,2,3 .. to 365 or 366 
to_char(sysdate, 'w') --- week of a month, 1,2,3,4 or 5 
to_char(sysdate, 'ww') --- week of a year, 1,2,3 .. to 52 

Thêm tại đây: to_char.

+7

không có cách nào trong số này giải quyết được vấn đề, lần đầu tiên nguy hiểm là "ngày trong tuần" là khu vực phụ thuộc, ví dụ: 1 = Chủ Nhật ở Hoa Kỳ, thứ Hai ở Vương quốc Anh. – ninesided

+0

Đúng và được chấp nhận. Và tôi dint yêu cầu trả lời câu hỏi, chỉ cần thêm thông tin. Câu trả lời của bạn đã giải quyết được vấn đề. – Guru

1

bộ NLS_TERRITORY trước

alter session set NLS_TERRITORY=SWEDEN; 

Vì vậy, bạn có chắc đó con số này cuối tuần

2
MOD(TO_CHAR(my_date, 'J'), 7) + 1 IN (6, 7) 

là không đúng! Số ngày trong những ngày cuối tuần có thể là 6 & 7 hoặc 7 và 1, tùy thuộc vào cài đặt NLS.

Vì vậy, các thử nghiệm PROPER (không phụ thuộc vào NLS-settings) là một trong những này đã đề cập trước:

TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') 
+1

Tôi nghĩ rằng bạn có thể không đúng ở đây, định dạng 'J' đại diện cho ngày Julian, số ngày kể từ thời điểm cố định trong thời gian và hoàn toàn độc lập với cài đặt NLS. Xem bài viết này để tham khảo: http://en.wikipedia.org/wiki/Julian_day#Finding_day_of_week_given_Julian_day_number – ninesided

1

Theo tôi lựa chọn tốt nhất là

TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN')

+0

Nếu bạn đồng ý với người khác, bạn nên upvote họ, không thêm mã trùng lặp. –

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