Исключая все выше денормализованной даты в запросе - PullRequest
1 голос
/ 01 июля 2011

Я денормализовал свои данные (поэтому дата разбита на столбец год, месяц, день и час) Но теперь мне интересно, как запросить все до определенной даты.

Это НЕ работает:

SELECT * 
FROM  `impression_stat_hour` 
WHERE doneforday =0
AND (
    YEAR <=2011
    AND MONTH <=6
    AND DAY <=30
    AND HOUR <=1
)

Это на самом деле не будет "группировать" все записи вместе, как я хочу их, в результате чего дата (например) всегда будет от часа 0 до часа 1.

Ответы [ 2 ]

1 голос
/ 01 июля 2011
  1. Вы должны усложнить условие для обработки связей:

    AND (YEAR < 2011 OR (YEAR = 2011 
      AND (MONTH < 6 OR (MONTH = 6 
        AND (DAY < 30 OR (DAY = 30 AND HOUR <= 1))))))
    
  2. Вероятно, легче читать, если объединить столбцы обратно в значение DATETIME, а затем сравнить его с конкретным литералом даты и времени:

    AND (STR_TO_DATE(CONCAT(YEAR,'-', MONTH,'-', DAY, ' ', HOUR), 
     '%Y-%m-%d %h') < '2011-06-30 02:00')
    
  3. Вы также можете сохранить дополнительный столбец, который является действительным DATETIME на основе того же значения, что и столбцы с отдельными компонентами datetime. Это позволит вам индексировать столбец datetime для более эффективного поиска.

    AND (complete_date < '2011-06-30 02:00')
    

Я только что проверил это на MySQL 5.5, включая ответ от @Flimzy. Единственный, кто может использовать индекс, - это мой метод 3, приведенный выше, с избыточным столбцом.

1 голос
/ 01 июля 2011
SELECT ...
WHERE
    YEAR < 2011
    OR (YEAR = 2011 AND MONTH < 6)
    OR (YEAR = 2011 AND MONTH = 6 AND DAY < 30)
    OR (YEAR = 2011 AND MONTH = 6 AND DAY = 30 AND HOUR <= 1)

Или:

SELECT ...
WHERE STR_TO_DATE(CONCAT(year,'-',month,'-',day,' ',hour,':00:00')) <= '2011-06-30 01:00:00';

Последнее, вероятно, намного медленнее (поскольку оно не может использовать индексы для ваших различных столбцов даты. Оно также не проверено, поскольку является единственной (древней) версиейMySQL, к которому у меня есть доступ, не поддерживает STR_TO_DATE ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...