2010-01-11 41 views
7

Tất cả,MYSQL - Truy lục Dấu thời gian giữa các ngày

Tôi có bảng MYSQL có cột được gọi là dấu thời gian. Nó thuộc loại dữ liệu DATETIME và có các giá trị như "10/1/2009 3:25:08 PM '," 10/1/2009 3:30:05 PM', "10/4/2009 3:40:01 PM ' , vv ..

tôi muốn viết một truy vấn SQL để chọn tất cả các giá trị trong các lĩnh vực occuring timestamp giữa hai ngày .. một cái gì đó như thế này:

select timestamp from tablename where timestamp >= userStartDate and timestamp <= userEndDate 

ngày userInput sẽ không có phần thời gian. bạn có thể xin đề nghị đúng MySQL Query Cú pháp cho việc này? Cảm ơn

+0

Bởi "thuộc tính datetime" có nghĩa là nó có kiểu dữ liệu 'DATETIME'? – Quassnoi

+0

có. đúng là – Jake

Trả lời

14
SELECT timestamp 
FROM tablename 
WHERE timestamp >= userStartDate 
     AND timestamp < userEndDate + INTERVAL 1 DAY 

này sẽ chọn tất cả các kỷ lục havi ng phần ngày giữa userStartDateuserEndDate, miễn là các trường này có loại DATE (không có phần thời gian).

Nếu ngày bắt đầu và kết thúc đến như chuỗi, sử dụng STR_TO_DATE để chuyển đổi từ bất kỳ định dạng nhất định:

SELECT timestamp 
FROM tablename 
WHERE timestamp >= STR_TO_DATE('01/11/2010', '%m/%d/%Y') 
     AND timestamp < STR_TO_DATE('01/12/2010', '%m/%d/%Y') + INTERVAL 1 DAY 
+0

hmm .. Có thể userStartDate ở định dạng "10/01/2009" không? (mm/dd/yyyy) – Jake

8
SELECT timestamp 
FROM myTable 
WHERE timestamp BETWEEN startDate AND endDate 

Để có kết quả tốt nhất khi sử dụng BETWEEN với ngày hoặc thời gian giá trị, bạn nên sử dụng CAST() để chuyển đổi rõ ràng các giá trị thành loại dữ liệu mong muốn. Ví dụ: Nếu bạn so sánh DATETIME với hai giá trị DATE, hãy chuyển đổi các giá trị DATE thành DATETIME giá trị. Nếu bạn sử dụng hằng số chuỗi chẳng hạn như '2001-1-1' khi so sánh với một số DATE, hãy truyền chuỗi đó đến DATE.

-http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between

+1

Nếu cả hai 'startDate' và' endDate' là 'Jan 11, 2010', điều này sẽ chỉ chọn các bản ghi có' dấu thời gian = 11 tháng 1, 2010 00: 00: 00', không phải tất cả các bản ghi có ' 11 tháng 1 trong phần ngày. – Quassnoi

+0

Bạn nói đúng, Quassnoi. Nếu có thể với dữ liệu người dùng, hãy thêm 24 giờ (như bạn đã làm trong ví dụ của bạn). Tôi đã giả định rằng người dùng sẽ sử dụng các giá trị ngày giờ trong chính truy vấn đó. – Sampson

4

Ngày userInput sẽ không có timestamps. Bạn có thể chuyển đổi đầu vào dùng timestamp với:

mysql> SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19'); 
     -> 1196440219 

truy vấn của bạn có thể trở thành:

select timestamp from tablename 
where timestamp >= UNIX_TIMESTAMP(userStartDate) 
and timestamp <= UNIX_TIMESTAMP(userEndDate) 
2

Nếu bạn đang tìm kiếm để truy vấn một sự kiện giữa hai timestamps, cho một lịch hoặc một cái gì đó nơi bắt đầu và kết thúc là được lưu trữ dưới dạng dấu thời gian, bạn có thể sử dụng số này

$qry = "SELECT * 
     FROM `table` 
     WHERE '$today_start' >= `event_start` 
      AND '$today_start' <= `event_end`"; 
Các vấn đề liên quan