2009-07-29 37 views
36

Tôi đang sử dụng chức năng DAYOFWEEK() trong MySQL trả về cho chủ nhật. Nhưng ở quốc gia của tôi, tuần bắt đầu bằng thứ hai, không phải chủ nhật. Có cơ hội để có được ngày kể từ ngày MySQL hình thành như: (1 - Thứ Hai, 2 - Thứ Ba, ...)?MySQL DAYOFWEEK() - tuần của tôi bắt đầu bằng thứ hai

+0

tôi biết nó có thể được thực hiện với một số điều kiện khó chịu. Tôi thậm chí đã thử phương pháp tiếp cận modulo mà dường như tôi không làm việc (vì thực hiện Modulo lạ trong MySQL). Không có gì làm việc cho tôi cho đến nay. – picca

+1

nó là một lỗi mysql. Tuần bắt đầu vào thứ hai theo tiêu chuẩn ISO. http://en.wikipedia.org/wiki/ISO_week_date – woens

+1

Nó không phải là một lỗi. 'DAYOFWEEK()' sử dụng chuẩn ODBC. – rgtk

Trả lời

85

Sử dụng WEEKDAY() thay vì DAYOFWEEK(), bắt đầu vào thứ Hai.

Nếu bạn cần bắt đầu ở chỉ mục 1, hãy sử dụng hoặc WEEKDAY() + 1.

+0

Đôi khi tôi chỉ câm. Tôi có thể tìm ra, rằng chức năng như vậy được hỗ trợ bởi MySQL. Cảm ơn bạn. – picca

+13

nó không phải là bạn đó là câm. Tại sao ngày trong tuần sẽ trả về một giá trị khác so với ngày trong tuần? Đó là một ý tưởng ngớ ngẩn bởi mySQL. –

7

Làm thế nào về trừ một và thay đổi chủ nhật

IF(DAYOFWEEK() = 1, 7, DAYOFWEEK() - 1) 

Tất nhiên bạn sẽ phải làm điều này cho mỗi truy vấn.

+1

1 = Chủ nhật là tiêu chuẩn ODBC, vì vậy nó sẽ phải được truy vấn tôi nghĩ. –

+0

Tại sao lại là downvote? –

+0

Điều này hoạt động, nhưng nó quá phức tạp. – picca

1

thể ghi một udf và tham gia một giá trị để nói với nó mà ngày trong tuần nên 1 sẽ trông như thế này (vẽ trên câu trả lời từ John sử dụng MOD thay vì CASE):

DROP FUNCTION IF EXISTS `reporting`.`udfDayOfWeek`; 
DELIMITER | 
CREATE FUNCTION `reporting`.`udfDayOfWeek` (
    _date DATETIME, 
    _firstDay TINYINT 
) RETURNS tinyint(4) 
FUNCTION_BLOCK: BEGIN 
    DECLARE _dayOfWeek, _offset TINYINT; 
    SET _offset = 8 - _firstDay; 
    SET _dayOfWeek = (DAYOFWEEK(_date) + _offset) MOD 7; 
    IF _dayOfWeek = 0 THEN 
    SET _dayOfWeek = 7; 
    END IF; 
    RETURN _dayOfWeek; 
END FUNCTION_BLOCK 

để gọi chức năng này để cung cấp cho bạn ngày hiện tại của giá trị trong tuần khi tuần của bạn bắt đầu vào thứ ba ví dụ, bạn muốn gọi:

SELECT udfDayOfWeek(NOW(), 3); 

đẹp điều về việc có nó như là một udf là bạn cũng có thể gọi nó trên một trường tập kết quả như sau:

SELECT 
    udfDayOfWeek(p.SignupDate, 3) AS SignupDayOfWeek, 
    p.FirstName, 
    p.LastName 
FROM Profile p; 
+2

bạn có nghiêm túc không? – hobodave

+1

+1 lol ... vì vậy tôi thấy hơi chán. – codemonkey

+2

Bạn đang điên rồ codemonkey: D – picca

14

Hãy thử sử dụng chức năng WEEKDAY().

Trả về chỉ số ngày trong tuần cho ngày (0 = Thứ hai, 1 = Thứ ba,… 6 = Chủ nhật).

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