2010-07-23 73 views

Trả lời

41

Bạn có thể sử dụng:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

Điều này sẽ cung cấp cho bạn ngày thứ Hai tuần 3 năm 2010, đó sẽ là 2010-01-18.

Một ví dụ khác:

SELECT STR_TO_DATE('201052 Sunday', '%X%V %W'); 

sẽ cung cấp cho bạn ngày chủ nhật của tuần 52 của năm 2010, đó sẽ là 2010/12/26.

Và cuối cùng, sử dụng ví dụ ban đầu của bạn:

SELECT STR_TO_DATE('201029 Sunday', '%X%V %W'); 

Điều này cho phép 2010/07/18.

+0

Nó hoạt động hoàn hảo. Cảm ơn – davykiash

+3

Khi sử dụng chế độ tuần 3 (tiêu chuẩn ISO, qv http://stackoverflow.com/questions/11788885/), sau đó CHỌN STR_TO_DATE ('201003 Thứ hai', '% X% V% W') sẽ cung cấp thứ hai sau tuần! – ChrisV

+1

Tôi nghĩ nó không chính xác. Hãy thử chạy SELECT STR_TO_DATE ('201402 Chủ Nhật', '% X% V% W'), STR_TO_DATE ('201402 Thứ Hai', '% X% V% W') - bạn sẽ thấy rằng đó không phải là chủ nhật của tuần thứ 2 và thứ hai của tuần thứ 2 - đó là thứ hai chủ nhật và thứ hai thứ hai của YEAR – 1nstinct

0

chưa được kiểm tra (Tôi không có MySQL trong tầm tay):

date_add(
    date_sub(curdate(), interval weekday(curdate()) day), 
    interval ((NUM-weekofyear(curdate()))*7) day) 
47

Đây là một cách chính xác nhận ngày đầu tiên của tuần và ngày cuối cùng của tuần dựa trên ngày hiện tại:

adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd 
+9

Tôi nghĩ rằng giải pháp này có thể bị ảnh hưởng bởi ngôn ngữ hệ thống. 'adddate (curdate(), INTERVAL -WEEKDAY (curdate()) DAY) WeekStart' –

+1

@SnowBlind, cảm ơn bạn đã bình luận của bạn. ... và nếu ai đó đang tìm kiếm Thứ Sáu là ngày cuối tuần (ví dụ: Ngày làm việc cuối cùng), hãy thử: adddate(curdate(), INTERVAL 4-WEEKDAY(curdate()) DAY) SHOULD_BE_Friday Peter

4

Câu trả lời thích nhất cho đến nay trên tàu này trông như thế này ở dạng cơ bản của nó:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

Đây là một câu trả lời tốt để bắt đầu, nhưng nó phá vỡ trong một số ngày khi bạn bắt đầu đặt nó để sử dụng trong conjuction với tuần() chức năng trừ khi bạn thêm một số logic thêm .

Dưới đây là một chặng đường dài, phiên bản lộn xộn trong những điều tương tự, nhưng mà dường như để làm việc trên tất cả các ngày (BTW ngày hiện tại được xây dựng vào asnwer này):

SELECT STR_TO_DATE(
(IF(CAST(WEEK(NOW(),0) AS UNSIGNED) = 0, 
(CONCAT(
CAST((CAST(YEAR(NOW()) AS UNSIGNED) - 1) AS CHAR), 
'52 Sunday')), 
(CONCAT(
CAST(YEAR(NOW()) AS CHAR), 
IF(CAST(WEEK(NOW(),0) AS UNSIGNED) < 10,'0',''), 
CAST(WEEK(NOW(),0) AS CHAR), 
' Sunday')))), 
'%X%V %W'); 

mớ hỗn độn này xử lý các vấn đề phát sinh khi năm trôi qua vào những ngày nhất định trong tuần. Ví dụ: 2011 bắt đầu vào thứ Bảy, do đó, chủ nhật bắt đầu tuần là vào năm trước. Đây là lựa chọn với các ví dụ mã hóa cứng:

SELECT STR_TO_DATE(
(IF(CAST(WEEK('2011-01-01',0) AS UNSIGNED) = 0, 
(CONCAT(
CAST((CAST(YEAR('2011-01-01') AS UNSIGNED) - 1) AS CHAR), 
'52 Sunday')), 
(CONCAT(
CAST(YEAR('2011-01-01') AS CHAR), 
IF(CAST(WEEK('2011-01-01',0) AS UNSIGNED) < 10,'0',''), 
CAST(WEEK('2011-01-01',0) AS CHAR), 
' Sunday')))), 
'%X%V %W'); 

yeilds >> '2010/12/26'

SELECT STR_TO_DATE(
(IF(CAST(WEEK('2011-01-02',0) AS UNSIGNED) = 0, 
(CONCAT(
CAST((CAST(YEAR('2011-01-02') AS UNSIGNED) - 1) AS CHAR), 
'52 Sunday')), 
(CONCAT(
CAST(YEAR('2011-01-02') AS CHAR), 
IF(CAST(WEEK('2011-01-02',0) AS UNSIGNED) < 10,'0',''), 
CAST(WEEK('2011-01-02',0) AS CHAR), 
' Sunday')))), 
'%X%V %W'); 

yeilds >> '2011/01/02'

Tất cả những gì đã nói, Tôi thích những người khác đã đăng nội dung như thế này

SELECT 
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd; 

Phương pháp này dường như chỉ hoạt động tốt ở tất cả các ngày mà không có sự lộn xộn!

+1

Bạn không thể làm điều này đơn giản hơn nhiều bằng cách sử dụng chế độ 2? YEARWEEK ('2011-01-01', 2) báo cáo tuần 52 của năm 2010, trái ngược với chế độ 0, trả về tuần thứ 0 của năm 2011. – user1618143

2

Nếu tuần bắt đầu của bạn là chủ nhật và cuối tuần là thứ bảy, sử dụng cái này:

SELECT 
    DATE_ADD(CURDATE(), INTERVAL (MOD(DAYOFWEEK(CURDATE())-1, 7)*-1) DAY) AS week_start, 
    DATE_ADD(CURDATE(), INTERVAL ((MOD(DAYOFWEEK(CURDATE())-1, 7)*-1)+6) DAY) AS week_end 

Thử nghiệm trên MySQL.

0
SELECT CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),2),'-', 
     MID(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),6,2),'-', 
     LEFT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),4)) AS 'Lundi', 

    CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),2),'-', 
     MID(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),6,2),'-', 
     LEFT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),4)) AS 'Dimanche'; 
0

Một sự thêm vào câu trả lời của DCP:

SELECT STR_TO_DATE('201553 Monday', '%x%v %W') 

sẽ cung cấp cho bạn thứ hai khi bắt đầu của bạn trong tuần là thứ hai. Các định dạng chỉ cần phải được viết nhỏ. Không cần toán học.

3

Đây có thể là cách đơn giản và năng động nhất. Sử dụng mã sau đây.

SELECT STR_TO_DATE(concat(concat(date_format(CURDATE() , '%Y') , WEEKOFYEAR(CURDATE())) , ' Monday') , '%X%V %W'); 
Các vấn đề liên quan