2010-10-18 32 views
7

Tôi cần tính toán các tuần trong một ngày trong câu lệnh chọn MySQL của tôi. Có một cột ngày tháng ở một trong các bảng, và tôi cần tính toán số ngày đó là bao nhiêu.MySQL: Cách tính tuần ra khỏi một ngày cụ thể?

SELECT EventDate, (calculation) AS WeeksOut FROM Events; 

Ví dụ:

  • 6 ngày nữa, tuần ra = 0
  • 7 ngày nữa, tuần ra = 1
  • 13 ngày nữa, tuần ra = 1
  • 14 ngày đi, tuần ra = 2
+0

Bạn muốn làm gì trong một tuần? Ví dụ: nên 3.2857 tuần là 3 tuần, 4 tuần hoặc một cái gì đó ở giữa? –

+0

Có, nó phải được làm tròn đến toàn bộ tuần gần nhất – Andrew

Trả lời

17

Sử dụng DATEDIFF function:

ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout 

Vấn đề với WEEKS là nó sẽ không trả lại kết quả chính xác cho những ngày vượt qua ngày 1 tháng 1.

0 là số chữ số thập phân để sử dụng trong chức năng ROUND.

+1

+1 Điểm tốt về vấn đề năm mới, đã không nghĩ đến điều đó ... –

+0

Cộng với một Nhưng bạn có thể thêm liên kết vào tài liệu để có giải thích tốt hơn không. Tại sao 0 sau 7? –

+1

@JohnMax: Đã thêm thông tin về 0. –

3

Đây là một cách đơn giản để làm điều đó:

SELECT EventDate, (week(EventDate) - week(curdate())) AS WeeksOut FROM Events; 

Ví dụ:

mysql> select week('2010-11-18') - week ('2010-10-18'); 
+------------------------------------------+ 
| week('2010-11-18') - week ('2010-10-18') | 
+------------------------------------------+ 
|          4 | 
+------------------------------------------+ 
1 row in set (0.00 sec) 

lựa chọn khác là tính toán khoảng thời gian trong ngày và chia cho 7:

SELECT EventDate, datediff(EventDate,curdate())/7 AS WeeksOut FROM Events; 

Ví dụ:

mysql> select datediff('2010-11-18' , '2010-10-18')/7; 
+-------------------------------------------+ 
| datediff('2010-11-18' , '2010-10-18')/7 | 
+-------------------------------------------+ 
|         4.4286 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 
+0

Giải thích tuyệt vời +1 từ phía tôi – w3uiguru

2

Để vượt qua toàn bộ vấn đề "Năm mới" và bạn vẫn muốn sử dụng WEEK(), tôi thấy phương pháp sau khá hiệu quả.

SELECT 
    YEAR(end_date)*52+WEEK(end_date) 
    - YEAR(start_date)*52 - WEEK(start_date) as weeks_out 
FROM 
    events; 

Sự khác biệt với phương pháp này (trái ngược với phương pháp DATEDIFF) là nó được căn chỉnh theo tuần. Vì vậy, hôm nay (thứ Hai) và thứ Sáu tuần trước sẽ trả về 1 bằng cách sử dụng phương pháp này, nhưng sẽ trả về 0 với phương pháp DATEDIFF

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