JanBal
JanBal

Reputation: 49

mysql results by date future and past

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.

=========

SOLUTION:

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

Answers (3)

Tim Biegeleisen
Tim Biegeleisen

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

etsa
etsa

Reputation: 5060

Try:

SELECT estatu,edates,etimes 
FROM tevent 
WHERE edates 
BETWEEN  CURDATE() AND DATE_SUB(CURDATE(),INTERVAL -8 DAY);

Upvotes: 0

Sloan Thrasher
Sloan Thrasher

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

Related Questions