Как сравнить 10-значную дату Unix с форматом даты дд / мм / гггг в MySQL? - PullRequest
1 голос
/ 22 ноября 2011

Я хочу перечислить все продукты с 01.01.2008 по 31.10.2008.Дата ввода продукта в mysql вводится в 10-значном формате.Это SQL, который я пробовал, но он возвращает все данные из таблицы и игнорирует сравнение дат:

SELECT productid, productname
  FROM products
 WHERE FROM_UNIXTIME(entry_date,'%d/%m/%Y') BETWEEN '01/01/2008' and '31/12/2008'

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Вы не говорите, какой тип данных у вашей десятизначной записи entry_date.

Если это тип DATETIME, вы делаете это сложнее, чем нужно. Вот запрос.

SELECT productid, productname
  FROM products
 WHERE entry_date >= str_to_date('01-01-2008', '%d-%m-%Y')
   AND entry_date < str_to_date('01-11-2008', '%d-%m-%Y')

Обратите внимание, что оператор BETWEEN не подходит для типов DATETIME. Если вы не укажете время, система предполагает, что вы имеете в виду полночь в указанную вами дату. Поэтому вам необходимо указать первый день ПОСЛЕ выбранной даты окончания (в данном случае выбранная вами дата окончания была 31 октября 2008 года, поэтому вам следует использовать 1 ноября 2008 года). Затем вам нужно использовать < вместо <= для верхней части диапазона, как показано.

Если вам не нужно использовать UNIX_TIMESTAMP типы данных, не используйте. Они менее гибкие, чем обычные DATETIME типы.

Если вы не возражаете указать свои даты в формате ГГГГ-ММ-ДД, это еще проще:

SELECT productid, productname
  FROM products
 WHERE entry_date >= '2008-01-01'
   AND entry_date < '2008-11-01'
1 голос
/ 22 ноября 2011

Два совета:

  1. Воспользуйтесь формой даты в MySQL.
  2. Поместите расчет в постоянную часть сравнения.

Если сложить их вместе, ваш запрос должен выглядеть следующим образом:

SELECT productid, productname
  FROM products
 WHERE entry_date BETWEEN UNIX_TIMESTAMP('2008-01-01') AND UNIX_TIMESTAMP('2009-01-01')

Использование собственного формата даты означает, что вам не нужно играть в игры с параметрами форматирования. Но в этом запросе больший выигрыш от помещения вычисления в постоянную часть сравнения. Это выигрыш, потому что MySQL должен выполнять вычисления только один раз, а не в каждой строке, на которую он смотрит. Это также означает, что он может использовать индекс в этом поле, если он есть.

Кстати, я часто использую подобные запросы.

(И я использовал «2009-01-01» в конце диапазона, чтобы избежать ошибки «один на один». (Метки времени Unix с точностью до секунды, а дата без времени превращается в полночь). исключил 31 декабря из вашего набора результатов.)

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