SQL выбирает все данные за последние 45 дней - PullRequest
0 голосов
/ 10 мая 2018

У меня есть таблица "оповещений" с полем даты - targetDate.

Я бы хотел выбрать все данные за последние 45 дней.

Я попробовал приведенный ниже код, но он не дал никаких результатов ...

SELECT userID, refID, `targetDate`
FROM alerts
WHERE type = 'travelSoon'
AND DATEDIFF( CURDATE( ) , targetDate ) > 45

Таблица

 id     userID  type    refID   createDate  targetDate  lastSendDate    sent    valid
1   26  travelSoon  NO  2018-05-02 13:54:25 0000-00-00  2018-05-02 00:00:00 0   1
2   26  travelSoon  NO  2018-05-02 13:55:50 2018-06-01  0000-00-00 00:00:00 0   1
3   26  travelSoon  DK  2018-05-02 13:56:12 2018-12-01  0000-00-00 00:00:00 0   1
4   26  travelSoon      2018-05-02 13:59:50 0000-00-00  0000-00-00 00:00:00 0   1
5   26  travelSoon      2018-05-02 14:00:09 2018-08-01  0000-00-00 00:00:00 0   1
6   26  travelSoon  DK  2018-05-02 14:00:48 2018-08-01  0000-00-00 00:00:00 0   1
7   26  travelSoon      2018-05-02 16:45:18 2018-05-01  0000-00-00 00:00:00 0   1
8   26  travelSoon  RO  2018-05-02 16:45:45 2018-04-01  0000-00-00 00:00:00 0   1

Ответы [ 5 ]

0 голосов
/ 11 мая 2018
SELECT userID, refID, `targetDate`
FROM alerts
WHERE type = 'travelSoon'
AND targetDate >= ( CURDATE() - INTERVAL 45 DAY )
0 голосов
/ 10 мая 2018

Стандартный синтаксис ANSI будет:

SELECT userID, refID, `targetDate`
FROM alerts
WHERE type = 'travelSoon' AND
      targetDate >= CURRENT_DATE - interval '45 day' AND
      targetDate <= CURRENT_DATE;

В MySQL (что предполагает ваш синтаксис:

SELECT userID, refID, `targetDate`
FROM alerts
WHERE type = 'travelSoon' AND
      targetDate >= CURRENT_DATE - interval 45 day AND
      targetDate <= CURRENT_DATE;
0 голосов
/ 10 мая 2018

Использование DATEDIFF() - плохая идея.Он блокирует возможность использования индексов, и есть альтернатива, которая не ...

SELECT *
  FROM alerts
 WHERE type = 'travelSoon'

   AND targetDate >= DATEADD(DAY, -45, GETDATE())    -- SQL Server

   AND targetDate >= CURDATE() - INTERVAL 45 DAY     -- MySQL

http://www.sqlfiddle.com/#!9/4ecdc0/6

0 голосов
/ 10 мая 2018

Попробуйте это ...

SELECT userid, refid, `targetdate` 
FROM   alerts 
WHERE  type = 'travelSoon' 
       AND Datediff(Curdate(), targetDate) < 45 -- or <=45 
       AND Datediff(Curdate(), targetDate) > 0 

Онлайн демо: http://www.sqlfiddle.com/#!9/4ecdc0/4/0

Если вы используете только условие Datediff(Curdate(), targetDate) < 45, оно может возвращать как прошлые, так и будущие даты. Пожалуйста, обратитесь к таблице ниже.

Today: May 10, 2018

+----+-------------+
| id | targetDate  |  DATEDIFF(CURDATE(), targetDate) 
+----+-------------+
|  2 | ????-??-?? |                             -22 
|  3 | ????-??-?? |                            -205 
|  5 | ????-??-?? |                             -83 
|  6 | ????-??-?? |                             -83 
|  7 | 2018-05-01  |                               9 
|  8 | 2018-04-01  |                              39 
+----+-------------+ 

Чтобы избежать этого, вы можете использовать другое условие, подобное этому ...

Datediff(Curdate(), targetDate) > 0
0 голосов
/ 10 мая 2018

В MSSQL DATEDIFF(interval, date1, date2) возвращает интервал date2 - date1.

Интервал должен быть выбран из этого списка:

- year, yyyy, yy = Year
- quarter, qq, q = Quarter
- month, mm, m = month
- dayofyear = Day of the year
- day, dy, y = Day
- week, ww, wk = Week
- weekday, dw, w = Weekday
- hour, hh = hour
- minute, mi, n = Minute
- second, ss, s = Second
- millisecond, ms = Millisecond`

Тогда используйте:

SELECT userID, refID, `targetDate`
FROM alerts
WHERE type = 'travelSoon'
AND DATEDIFF(day, targetDate, GETDATE() ) > 45

Для MySQL вы можете использовать TIMESTAMPDIFF(unit,date1,date2), который возвращает интервал date1 - date2.

unit можно выбрать из MICROSECOND (microseconds), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.

SELECT userID, refID, `targetDate`
FROM alerts
WHERE type = 'travelSoon'
AND TIMESTAMPDIFF(DAY, CURDATE( ), targetDate) > 45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...