2012-09-06 40 views
7

cho đến hôm nay khi tôi đang làm việc với MySQL và cần thực hiện hành động với ngày/giờ tôi đang sử dụng cột int với dấu thời gian unix và không có vấn đề gì, nhưng hôm nay sau khi đọc một số hướng dẫn tôi quyết định cột dấu thời gian thử nghiệm với "current_timestamp" theo mặc định.MySQL Chọn dữ liệu tháng trước bởi current_timestamp

Vì vậy, tôi quan tâm đến cách chọn dữ liệu tháng trước theo cột trong đó thông tin ở định dạng "2012-09-07 00:23:30"? Và có thể có một số truy vấn phức tạp sẽ cung cấp cho tôi dữ liệu từ đầu tháng này (không phải 30 ngày qua, nhưng từ 09-01 00:00:00 đến hôm nay)?

+0

Tôi phải đối mặt với một vấn đề tương tự cách đây không lâu và kết thúc tính toán ngày qua ngôn ngữ phía máy chủ (trong trường hợp này là php nhưng sẽ cho phép bạn thực hiện việc này). Dù sao, cũng quan tâm đến điều này :) – jribeiro

+0

@jribeiro Gửi một câu trả lời, có một cái nhìn. – Ariel

Trả lời

17

này sẽ cung cấp cho bạn các tháng trước:

WHERE dateColumn BETWEEN SUBDATE(CURDATE(), INTERVAL 1 MONTH) AND NOW(); 

này từ khi bắt đầu của tháng:

WHERE dateColumn BETWEEN STR_TO_DATE('2012-09-01', '%Y-%m-%d') AND NOW(); 

Các GIỮA là không có gì đặc biệt, nó chỉ là một phím tắt cho

dateColumn <= ... AND dateColumn >= .... 

Hmm, tôi đoán so sánh NOW() không thực sự cần thiết, vì tất cả các bản ghi sẽ là trước đây.

Vì vậy, chỉ cần làm:

WHERE dateColumn >= STR_TO_DATE('2012-09-01', '%Y-%m-%d') 

khởi động của tháng hiện tại:

WHERE dateColumn >= CURDATE() - INTERVAL DAY(CURDATE())-1 DAY 

Tất cả điều này là trích xuất các ngày trong tháng từ ngày hiện tại, sau đó trừ đi nhiều ngày ít một từ nó.

+0

Vấn đề tôi thấy với điều này là nếu truy vấn cần phải năng động. Tôi làm điều này nhưng tôi vẫn phải tìm sự bắt đầu của tháng ở phía máy chủ. Nhưng có lẽ điều này vượt xa những gì mà OP yêu cầu. :) – jribeiro

+0

@jribeiro Động không có vấn đề gì - tôi đã cập nhật câu trả lời. – Ariel

3

Bạn nên có một cái nhìn tại common_schema, thật dễ dàng để cài đặt và có nhiều công cụ tuyệt vời, bao gồm một chức năng gọi là start_of_month() đó là chính xác những gì bạn đang tìm kiếm:

select * 
from your_table 
where your_column >= common_schema.start_of_month(now()) 
-1

Nếu bạn có một timestamp mysql , một cái gì đó giống như 2013-09-29 22:27:10 bạn có thể làm

select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9; 

Chuyển đổi này để unix, sau đó sử dụng các chức năng thời gian unix để trích xuất tháng, trong trường hợp này 9 tháng Chín.

+1

tốt hơn là 'chọn * từ bảng nơi MONTH (thời gian) = (MONTH (NGAY())); ' – Federico

+0

Còn tháng này năm sau thì sao? – Mala

+0

có thể chọn * từ bảng nơi MONTH (thời gian) = (MONTH (NGAY())) và NĂM ​​(thời gian) = NĂM (NGAY())); – Stenyg

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