Reputation: 49
I'm trying to get records from database for last 14 days, and future 14 days only. The past I can get, but future is a problem.
Here is a sample of what dating format I'm trying (8 day sample) which works fine on my server:
mysql> select DATE_SUB(CURDATE(),INTERVAL +8 DAY);
+-------------------------------------+
| DATE_SUB(CURDATE(),INTERVAL +8 DAY) |
+-------------------------------------+
| 2017-09-07 |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> select DATE_SUB(CURDATE(),INTERVAL -8 DAY);
+-------------------------------------+
| DATE_SUB(CURDATE(),INTERVAL -8 DAY) |
+-------------------------------------+
| 2017-09-23 |
+-------------------------------------+
1 row in set (0.00 sec)
This seems to work fine to get past and future dates but, when trying it inline with my actual query it doesn't want to work for future dating.
mysql> SELECT estatu,edates,etimes
FROM tevent
WHERE edates
BETWEEN DATE_SUB(CURDATE(),INTERVAL +8 DAY) AND CURDATE();
+----------+------------+--------+
| estatu | edates | etimes |
+----------+------------+--------+
| Upcoming | 2017-09-15 | 19:00 |
| Upcoming | 2017-09-15 | 17:00 |
| Results | 2017-09-09 | 15:00 |
| Upcoming | 2017-09-15 | |
| Results | 2017-09-08 | |
| Results | 2017-09-08 | 19:00 |
| Results | 2017-09-08 | 19:30 |
| Results | 2017-09-08 | 19:30 |
| Results | 2017-09-09 | 09:30 |
| Results | 2017-09-09 | 12:00 |
| Results | 2017-09-09 | 15:00 |
| Results | 2017-09-09 | 17:00 |
| Results | 2017-09-09 | 18:00 |
| Results | 2017-09-09 | 19:30 |
| Results | 2017-09-09 | 20:30 |
| Upcoming | 2017-09-15 | |
+----------+------------+--------+
16 rows in set (0.00 sec)
mysql> SELECT estatu,edates,etimes
FROM tevent
WHERE edates
BETWEEN DATE_SUB(CURDATE(),INTERVAL -8 DAY) AND CURDATE();
Empty set (0.00 sec)
This is the nearest I got so far trying various script found here and elsewhere on the net.
This Query is just to confirm I have future events:
mysql> SELECT estatu,edates,etimes
FROM tevent
WHERE edates
LIMIT 10;
+----------+------------+--------+
| estatu | edates | etimes |
+----------+------------+--------+
| Upcoming | 2017-09-15 | 19:00 |
| Upcoming | 2017-09-15 | 17:00 |
| Upcoming | 2017-09-16 | 17:00 |
| Upcoming | 2017-09-23 | 15:00 |
| Upcoming | 2017-09-23 | 17:00 |
| Results | 2017-09-09 | 15:00 |
| Upcoming | 2017-09-15 | |
| Results | 2017-03-26 | |
| Results | 2017-04-02 | |
| Results | 2017-04-09 | |
+----------+------------+--------+
10 rows in set (0.00 sec)
EDIT: I need two separate results, one for future events, one for past events. Each will be requested independently from separate PHP page connections.
=========
Thanks to @etsa the problem found to be the format. The below two queries provide exactly what is required, again with an 8 day sample:
SELECT estatu,edates,etimes FROM tevent WHERE edates BETWEEN DATE_SUB(CURDATE(),INTERVAL +8 DAY) AND CURDATE();
SELECT estatu,edates,etimes FROM tevent WHERE edates BETWEEN CURDATE() AND DATE_SUB(CURDATE(),INTERVAL -8 DAY);
The results looks like this:
mysql> SELECT estatu,edates,etimes FROM tevent WHERE edates BETWEEN DATE_SUB(CURDATE(),INTERVAL +8 DAY) AND CURDATE();
+----------+------------+--------+
| estatu | edates | etimes |
+----------+------------+--------+
| Upcoming | 2017-09-15 | 19:00 |
| Upcoming | 2017-09-15 | 17:00 |
| Results | 2017-09-09 | 15:00 |
| Upcoming | 2017-09-15 | |
| Results | 2017-09-08 | |
| Results | 2017-09-08 | 19:00 |
| Results | 2017-09-08 | 19:30 |
| Results | 2017-09-08 | 19:30 |
| Results | 2017-09-09 | 09:30 |
| Results | 2017-09-09 | 12:00 |
| Results | 2017-09-09 | 15:00 |
| Results | 2017-09-09 | 17:00 |
| Results | 2017-09-09 | 18:00 |
| Results | 2017-09-09 | 19:30 |
| Results | 2017-09-09 | 20:30 |
| Upcoming | 2017-09-15 | |
+----------+------------+--------+
16 rows in set (0.00 sec)
mysql> SELECT estatu,edates,etimes FROM tevent WHERE edates BETWEEN CURDATE() AND DATE_SUB(CURDATE(),INTERVAL -8 DAY);
+----------+------------+--------+
| estatu | edates | etimes |
+----------+------------+--------+
| Upcoming | 2017-09-15 | 19:00 |
| Upcoming | 2017-09-15 | 17:00 |
| Upcoming | 2017-09-16 | 17:00 |
| Upcoming | 2017-09-23 | 15:00 |
| Upcoming | 2017-09-23 | 17:00 |
| Upcoming | 2017-09-15 | |
| Upcoming | 2017-09-15 | |
| Upcoming | 2017-09-16 | 19:30 |
| Upcoming | 2017-09-16 | 09:30 |
| Upcoming | 2017-09-16 | 19:30 |
| Upcoming | 2017-09-16 | 14:00 |
| Upcoming | 2017-09-16 | 15:00 |
| Upcoming | 2017-09-16 | 19:30 |
| Upcoming | 2017-09-17 | |
| Upcoming | 2017-09-17 | |
+----------+------------+--------+
15 rows in set (0.00 sec)
Upvotes: 2
Views: 1028
Reputation: 521073
None of the other answers give you exactly what you asked for, but this does:
SELECT
estatu,
edates,
etimes
FROM tevent
WHERE
edates BETWEEN DATE_SUB(CURDATE(),INTERVAL 14 DAY) AND
DATE_ADD(CURDATE(),INTERVAL 14 DAY);
If you wanted separate queries for past and present you could use:
SELECT estatu, edates, etimes
FROM tevent
WHERE edates BETWEEN DATE_SUB(CURDATE(),INTERVAL 14 DAY) AND CURDATE()
for past and this for future:
SELECT estatu, edates, etimes
FROM tevent
WHERE edates BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 14 DAY)
Upvotes: 0
Reputation: 5060
Try:
SELECT estatu,edates,etimes
FROM tevent
WHERE edates
BETWEEN CURDATE() AND DATE_SUB(CURDATE(),INTERVAL -8 DAY);
Upvotes: 0
Reputation: 5040
You aren't getting future dates because your between isn't right:
SELECT estatu,edates,etimes
FROM tevent
WHERE edates
BETWEEN DATE_ADD(CURDATE(),INTERVAL -8 DAY) AND DATE_ADD(CURDATE(),INTERVAL +8 DAY);
In the between clause, lower (earlier) value first, higher value second.
Upvotes: 2