SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 27.10.2009 10:06:27

victort
Участник
Зарегистрирован: 27.10.2009
Сообщений: 6

Работа с датами (WEEK)

Здравствуйте подскажите пожалуста почему не работают такие запросы:

SELECT * FROM `table` WHERE `data` = 'WEEK(CURDATE(),1)' LIMIT 0 , 30  текущая неделя

SELECT * FROM `table` WHERE `data` = 'WEEK (CURDATE(),1) - INTERVAL 1 WEEK' LIMIT 0 , 30  предыдущая неделя

Нужно вывести информацию за текущую/предыдущюю неделю
Тип данных `data` date
Версии mysql на которых проверял:

MySQL 3.23.53

MySQL 5.0.70

Неактивен

 

#2 27.10.2009 11:14:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Работа с датами (WEEK)

Потому, что 'WEEK(CURDATE(),1)'  - это строка, и вы пытаетесь сравнить её со значением типа date.

P.S. Если вы уберете кавычки, то WEEK(CURDATE(),1)  - будет числом. Соответственно, это тоже некорректное значение для типа date.

Неактивен

 

#3 27.10.2009 17:50:53

victort
Участник
Зарегистрирован: 27.10.2009
Сообщений: 6

Re: Работа с датами (WEEK)

То что там есть лишние кавычки я видел, убирал, это синтаксическая ошибка.

Тогда так:

SELECT * FROM `table` WHERE WEEK (`data`,1) = WEEK(CURDATE(),1) LIMIT 0 , 30  текущая неделя

SELECT * FROM `table` WHERE WEEK (`data`,1) = WEEK (CURDATE(),1) - INTERVAL 1 WEEK LIMIT 0 , 30  предыдущая.

Таким образом мы сравниваем числа недель.
Текущую неделю я вывожу а как вывести предыдущюю, данный подход возвращает NULL

Отредактированно victort (27.10.2009 18:01:51)

Неактивен

 

#4 27.10.2009 18:13:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с датами (WEEK)

Синтаксическая ошибка из-за пробелов между WEEK и (. Аккуратнее пишите smile
Ну и, конечно, оно не будет использовать индексы.

Неактивен

 

#5 28.10.2009 09:26:13

victort
Участник
Зарегистрирован: 27.10.2009
Сообщений: 6

Re: Работа с датами (WEEK)

SELECT * FROM `table` WHERE WEEK(`date`,1) = WEEK(CURDATE(),1) - INTERVAL 1 WEEK
Все пробелы я убрал всеравно предыдущую неделю не выводит.
Данное поле не проиндексованно, в чем еще ошибка.

Неактивен

 

#6 28.10.2009 09:36:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Работа с датами (WEEK)

У вас опять таже ошибка, что и в первом сообщении - некорректное сравнение типов данных. Вы из числа WEEK(CURDATE(),1) пытаетесь вычесть временной интервал INTERVAL 1 WEEK.

Нужно:
WEEK(CURDATE() - INTERVAL 1 WEEK);
или, что тоже самое
WEEK(CURDATE())-1  -- правда данный вариант будет неправильно работать в первую неделю года wink

Неактивен

 

#7 28.10.2009 09:39:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Работа с датами (WEEK)

victort написал:

Данное поле не проиндексованно, в чем еще ошибка.

Наличие индекса не приведет к ошибке. Речь идет о том, что если у вас есть индекс на поле `data`, то в данном выражении SELECT он не будет использован, что приведет к медленной работе при больших объемах таблицы.

Неактивен

 

#8 29.10.2009 11:40:06

victort
Участник
Зарегистрирован: 27.10.2009
Сообщений: 6

Re: Работа с датами (WEEK)

SELECT * FROM `table` WHERE WEEK(`date`,1) = WEEK(CURDATE(),1) - 1

WEEK(CURDATE())-1  -- правда данный вариант будет неправильно работать в первую неделю года  написал:

Потомучто первая неделя я так понимаю будет равна нулю при сравнении.
А если написать:

SELECT * FROM `table` WHERE IFNULL ( WEEK(`date`,1) = WEEK(CURDATE(),1) - 1,  WEEK(`date`,1)=53 AND YEAR(`date`)=YEAR(CURDATE())-1 )

Должно получится если условие не равно 0 то текущий год, если ноль то последняя неделя, она 53 плюс к этому вычисляем предыдущий год и сравниваем. Скорей всего я написал не правильно, но выложил идею решения задачи, поправте пожалуста.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson