2009-08-13 27 views

Trả lời

23

Nếu bạn không sử dụng MySQL cổ, bạn có thể bọc nó trong một chức năng được lưu trữ.

CREATE FUNCTION `LastMonday`() RETURNS DATETIME  
    RETURN DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) ; 

và sau đó gọi

select LastMonday() as LastMonday 

Cập nhật:

Nếu bạn gặp vấn đề hiệu suất, bạn có thể tồn tại các giá trị trong một biến phiên. Bằng cách đó bạn có thể chắc chắn rằng nó sẽ chỉ được tính một lần.

set @LastMonday=LastMonday(); 
select @Lastmonday; 

(trong truy vấn đơn giản này, nó làm cho không có sự khác biệt của khóa học ...)

+0

đó là chính xác làm thế nào tôi đã "tránh" các tính toán ngày dài tìm kiếm cho đến bây giờ ... Tôi đã/đang lo lắng về chi phí tiềm năng ... – lexu

+0

Tôi đã thêm vào "cập nhật hiệu suất" gợi ý của bạn để codebase của chúng tôi. Nó tạo nên sự khác biệt lớn, bằng cách nào đó tôi đã mong đợi hàm này chỉ được gọi một lần .. (nhưng làm cách nào để trình tối ưu hóa biết tôi không trả về thời gian tính bằng mili giây.) – lexu

+0

Bí quyết ở đây là giá trị được tính một lần và sau đó lưu vào bộ nhớ cache theo cách thủ công. Bạn có thể thử những gì trình tối ưu hóa làm. Nó có thể đủ thông minh để lưu trữ nó quá, nhưng bạn không thể thực sự dựa vào nó. –

-1

Hãy thử điều này:

-- Today is 05 April 2013 

-- Get Last Monday from MySQL 

SELECT DATE_FORMAT(LAST_DAY(NOW()) - ((7 + WEEKDAY(LAST_DAY(NOW())) - 7) % 7), '%Y-%m-%d') last_monday; 

-- Output 

last_monday 
------------- 
2013-04-29 
+0

Đối với tôi, điều đó không đơn giản hơn, cũng không thực hiện được nhiều hơn mã trong câu hỏi? .. nhưng tôi sẽ đưa ra gợi ý và sẽ tái cụm từ tiêu đề câu hỏi! – lexu

+0

Đối với tôi, kết quả đầu ra này không phải thứ hai tới mà là thứ hai sau đó. – DanM7

0
SET @dateCurrent = CURDATE(); 
SET @dateCurrentDayInWeek = DAYOFWEEK(@dateCurrent) - 2; 
SET @dateLastMonday = DATE_ADD(@dateCurrent, INTERVAL [email protected] DAY); 

SELECT @dateLastMonday; 
Các vấn đề liên quan