2011-12-10 41 views
11

Tôi đã lưu ngày đăng ký của người dùng làm ngày giờ, vì vậy, ví dụ: 2011-12-06 10:45:36. Tôi đã chạy truy vấn này và tôi mong đợi sản phẩm này - 2011-12-06 10:45:36 - sẽ được lựa chọn:MySQL - chọn dữ liệu từ cơ sở dữ liệu giữa hai ngày

SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND 
created_at <= '2011-12-06' 

Nhưng không phải vậy. Tồn tại bất kỳ cách thanh lịch, làm thế nào để chọn mặt hàng này? Như một ý tưởng đầu tiên mà tôi nhận được giống như 2011-12-06 + 1, nhưng điều này không có vẻ rất đẹp.

Trả lời

25

Vấn đề của bạn là phiên bản ngắn ngày sử dụng nửa đêm làm mặc định. Vì vậy, truy vấn của bạn thực sự là:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
AND created_at <= '2011-12-06 00:00:00' 

Đây là lý do tại sao bạn không nhìn thấy hồ sơ cho 10:45.

Thay đổi nó để:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01' 
AND created_at <= '2011-12-07' 

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

SELECT users.* from users 
WHERE created_at >= '2011-12-01' 
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY) 

Mà sẽ chọn tất cả người dùng trong khoảng thời gian tương tự như bạn đang tìm kiếm.

Bạn cũng có thể tìm ra GIỮA điều hành dễ đọc hơn:

SELECT users.* from users 
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY)); 
0

Có thể sử dụng ở giữa tốt hơn. Nó làm việc cho tôi để có phạm vi rồi lọc nó

1

Bạn đã thử trước và sau thay vì> = và < =? Ngoài ra, đây có phải là ngày hoặc dấu thời gian không?

+0

có, cột trong bảng là dấu thời gian – user984621

+0

của tôi xấu, trước và sau là từ cái gì khác. cho dấu thời gian, bạn cần thêm thời gian cũng như ngày mà người khác đã trả lời. – vextorspace

1

Tìm kiếm created_at <= '2011-12-06' sẽ tìm kiếm bất kỳ bản ghi nào được tạo vào hoặc trước nửa đêm vào ngày 2011-12-06 . Bạn muốn tìm kiếm created_at < '2011-12-07'.

+0

hiểu, cảm ơn! – user984621

3

Bạn cần sử dụng '2011-12-07' làm điểm kết thúc làm ngày không có thời gian mặc định là 00:00:00.

Vì vậy, những gì bạn đã thực sự viết được hiểu là:

SELECT users.* 
FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
    AND created_at <= '2011-12-06 00:00:00' 

Và tem thời gian của bạn là: 2011-12-06 10:45:36 mà không phải là giữa các điểm này.
Thay đổi này quá:

SELECT users.* 
FROM users 
WHERE created_at >= '2011-12-01' -- Implied 00:00:00 
    AND created_at < '2011-12-07' -- Implied 00:00:00 and smaller than 
            --     thus any time on 06 
+0

+1 Tôi nghĩ chúng tôi đã đăng cùng một câu trả lời chính xác cùng lúc :-) – dash

+0

@dash Trên thực tế Loki đã đăng nửa phút trước đó và được cho là câu trả lời được chấp nhận, nhưng bạn may mắn hơn. 1 cho anh ta cho câu trả lời nhanh hơn, và 1 cho bạn cho anh ta +1. –

5
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07'; 
1

Một lựa chọn khác là sử dụng DATE() chức năng trên các toán hạng tay trái như hình dưới đây

SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06' 

 

0

Bạn có thể sử dụng MySQL DATE fu nction như dưới đây

Ví dụ, nếu bạn muốn kết quả giữa 2017/09/05 đến 2017-09-09

SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09' 

Hãy chắc chắn để bọc các ngày trong nháy đơn ''

Hope this helps .

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