2013-03-22 32 views
12

Ai đó có thể giải thích cho tôi lý do tại sao hai kết quả này khác nhau không?Ngày PHP ('W') so với MySQL YEARWEEK (bây giờ())

Tôi thực hiện điều này bằng PHP.

date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312 

Và khi tôi thực hiện điều này với MySQL

SELECT YEARWEEK(now()); // outputs 201311 

Trả lời

33

Bạn cần phải xác định chế độ 3 trên gọi mysql nămTuần:

SELECT YEARWEEK(now(),3); 

Các PHP date() placeholder W trả về số tuần theo đến ISO 8601 specification. Điều đó có nghĩa là tuần bắt đầu vào thứ Hai (không phải chủ nhật), tuần đầu tiên của năm là số 1 (không phải 0), và tuần đó là tuần đầu tiên có ít nhất 4 ngày trong năm mới (vì vậy tuần đó có chứa Thứ Năm đầu tiên của năm). Theo the documentation for the MySQL WEEK function, rằng sự kết hợp của các tùy chọn là chế độ 3.

Ngoài ra, để kéo nốt Alles của thành câu trả lời chấp nhận bởi vì điều quan trọng là: giữ chỗ YW không đi cùng nhau. Nếu bạn muốn năm có số tuần theo ISO, bạn nên sử dụng o thay vì Y. Ví dụ, hãy xem xét Thứ hai 29 tháng 12, 2014:

date('YW', mktime(0,0,0,12,29,2014)); #=> 201401 : 1st week of 2014?? 
date('oW', mktime(0,0,0,12,29,2014)); #=> 201501 : better 
+0

Cảm ơn bạn Đánh dấu. Nó hoạt động –

+0

+1 cho câu trả lời, nhưng nếu tôi muốn sử dụng YEARWEEK để tổng hợp dữ liệu hàng tuần, và tôi muốn chủ nhật là ngày đầu tiên trong tuần?PHP có vẻ như không có tùy chọn để thay đổi ngày bắt đầu tuần – dzona

+0

Đó là lý do thứ hai ("chế độ") chỉ định. Đọc liên kết tài liệu ... các chế độ 0, 2, 4 và 6 tất cả bắt đầu tuần vào Chủ Nhật, khác với tuần 1 và có tuần 0 hoặc 53. –

3

YEARWEEK mất (không bắt buộc) tham số thứ hai là xác định phạm vi của tuần [0- 53] hoặc [1-53]).

Hàm này trả về số tuần cho ngày. Biểu mẫu hai đối số của TUẦN() cho phép bạn chỉ định xem tuần bắt đầu vào Chủ Nhật hay Thứ hai và liệu giá trị trả lại có nằm trong khoảng từ 0 đến 53 hoặc từ 1 đến 53.. được bỏ qua, giá trị của biến hệ thống default_week_format được sử dụng.

trong khi date(W)ISO8601 date luôn nằm trong khoảng [01-53]. Vì vậy, tôi đoán là theo mặc định, YEARWEEK đang sử dụng phạm vi [0-53].

Vì vậy, nếu bạn muốn nhận được cùng một kết quả thử sử dụng 1 như tham số thứ hai cho YEARWEEK

16

Xin lưu ý rằng nămTuần ('2012/01/01', 3) => 201.152 trong khi PHP " YW "sẽ cho năm 201252. Năm kết quả có thể khác với năm trong đối số ngày cho tuần đầu tiên và tuần cuối cùng của năm. (nghĩa là năm trong YEARWEEK là năm thứ Hai của tuần và không phải là năm của ngày được sử dụng để tính toán).

Để có được kết quả đúng, bạn cần làm

date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152 

là "o" mang đến cho bạn Năm tuần này thuộc về.

Tôi hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn với điều này! – Kostanos

+0

Cảm ơn ghi chú này - đã cứu tôi rất nhiều nhầm lẫn và có khả năng xé tóc ngày hôm nay, vì hôm nay là một phần của tuần tiếp theo. – cincodenada

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