SELECT вместе с NOW() возвращает 0 строк

Alinochka

Новичок
SELECT вместе с NOW() возвращает 0 строк

Всем привет ;)

Появилась непонятная проблема:
При выполнении совершенно обычного запроса на БД
PHP:
SELECT `record` FROM `ips` WHERE `ip`='93.120.222.122' AND `date`=NOW()
возвращается пустой результат, а при выполнении запроса без указания даты - все нормально
PHP:
SELECT `record` FROM `ips` WHERE `ip`='93.120.222.122'
Вот кусок БД:
Код:
record	ip	        date	        links
1	95.79.45.144	2010-06-06	1
2	93.120.236.71	2010-06-06	1
...
5	93.120.222.122	2010-06-14	9,6
Вопрос: почему так?
Скромная девушка очень надеется на помощь профессиналов :rolleyes:
 

Alinochka

Новичок
Я так и делала, сначала посмотрела, что возвращает NOW - возвращает дату вместе со временем, поэтому в моем скрипте уместнее использовать CURRENT_DATE() вместо NOW, так как она возвращает только дату. Тем самым проблема решилась. Всем спасибо :)
 

Вурдалак

Продвинутый новичок
Alinochka
Какой тип поля у date? Если бы был DATE, то такой бы проблемы не было.
 

Активист

Активист
Команда форума
Та же проблема. Запрос собственно заглчил! В чем трабла?

Код:
 CREATE TABLE `bestVotes` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `groupId` int(10) unsigned NOT NULL,
  `memberId` int(10) unsigned NOT NULL,
  `mark` smallint(5) unsigned NOT NULL,
  `userId` int(10) unsigned NOT NULL default '0',
  `userStatus` enum('U','R','S') NOT NULL default 'U',
  `ipAddr` bigint(20) default NULL,
  `date` date default NULL,
  `sms_pref` tinytext,
  `sms_txt` text,
  `sms_tid` tinytext,
  `sms_cn` varchar(2) default NULL,
  `sms_op` tinytext,
  `sms_phone` tinytext,
  `sms_sn` tinytext,
  `sms_test` int(11) default NULL,
  `sms_repeat` int(11) default NULL,
  `sms_rtime` bigint(20) default NULL,
  `sms_opn` int(11) default NULL,
  `sms_mpref` tinytext,
  `sms_tg` int(11) default NULL,
  `sms_cost` decimal(10,2) default NULL,
  `sms_zcost` decimal(10,2) default NULL,
  `sms_rate` decimal(10,4) default NULL,
  `sms_pay` decimal(10,4) default NULL,
  `sms_zpay` decimal(10,4) default NULL,
  `sms_md5` tinytext,
  PRIMARY KEY  (`id`),
  KEY `groupId` (`groupId`),
  KEY `memberId` (`memberId`),
  KEY `mark` (`mark`),
  KEY `userId` (`userId`),
  KEY `userStatus` (`userStatus`),
  KEY `ipAddr` (`ipAddr`),
  KEY `date` (`date`)
) ENGINE=InnoDB AUTO_INCREMENT=67594 DEFAULT CHARSET=cp1251 |

mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2011-04-01 07:39:32 |
+---------------------+
1 row in set (0.00 sec)


mysql> SELECT COUNT(`id`) FROM `bestVotes` WHERE `userId` = '53' && `groupId` = '6' && `memberId` = '263' && `date` = NOW();
+-------------+
| COUNT(`id`) |
+-------------+
|           0 |
+-------------+

mysql> SELECT COUNT(`id`) FROM `bestVotes` WHERE `userId` = '53' && `groupId` = '6' && `memberId` = '263' && `date` = '2011-04-01';
+-------------+
| COUNT(`id`) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT VERSION();
+-------------------+
| VERSION()         |
+-------------------+
| 5.0.51a-24+lenny5 |
+-------------------+
1 row in set (0.00 sec)
Нужно помощь причем срочно.
 

Вурдалак

Продвинутый новичок
Раньше работал типа? Я вот сейчас проверил у себя (5.1.40-community) — тоже нихрена. Насколько я помню, перед постингом я тогда проверял.
 

Активист

Активист
Команда форума
Да ебтить, работал! Раз в год на одном сайте проводим голосования, пипец просто там от накруток избавляемся, ну так вот, в прошлом году все заипись было, в этом открыли заново голосование код вообще не правили, единственное апнулись с debian etch до debian lenny.
Суть такая - голосовать зарегистрированному пользователю можно один раз в день за каждого участника, год назад все работало, а тут смотрю - колоссальные накрути, давай ковыряться - вижу - голоса поперли с одного зарег. пользователя сто раз, выяснилось, что простой метод всегда давайл FALSE:
PHP:
public function registredGetAllreadyVoted(MySQL $MySQL, $userId, $groupId, $memberId, $date = false) {
		$date = $date ? "'".$date."'" : "NOW()";
		$MySQL->query("SELECT COUNT(`id`) FROM `bestVotes` WHERE `userId` = '".(int)$userId."' && `groupId` = '".$groupId."' && `memberId` = '".(int)$memberId."' && `date` = {$date}", true);
		return $MySQL->field(0) == 0 ? false : true;
	}
Заменил на CURRENT_DATE() - все ок.

Может какой strict mode?
 

Активист

Активист
Команда форума
Ээээ!! Щито за косяки!!!?? HELP!

Код:
mysql> SELECT `id`, `userId`, `groupId`, `memberId`, `date` FROM `bestVotes` WHERE `date` = CURRENT_DATE() && `userId` > 1 && `userStatus` = 'R';
+-------+--------+---------+----------+------------+
| id    | userId | groupId | memberId | date       |
+-------+--------+---------+----------+------------+
| 67114 |  10769 |       6 |      231 | 2011-04-01 |
| 67115 |  10769 |       6 |      330 | 2011-04-01 |


mysql> SELECT `id`, `userId`, `groupId`, `memberId`, `date` FROM `bestVotes` WHERE `date` = CURRENT_DATE()-INTERVAL 1 HOUR && `userId` > 1 && `userStatus` = 'R';
Empty set (0.00 sec)

mysql>
 

Активист

Активист
Команда форума
Вопрос снят.
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html

Prior to MySQL 5.0.42, when DATE values are compared with DATETIME values, the time portion of the DATETIME value is ignored, or the comparison could be performed as a string compare. Starting from MySQL 5.0.42, a DATE value is coerced to the DATETIME type by adding the time portion as '00:00:00'. To mimic the old behavior, use the CAST() function to cause the comparison operands to be treated as previously. For example:
date_col = CAST(NOW() AS DATE)

Кто бы знал... Вот так обновляй софт, млять, багов теперь походу уйма.

Вурдалак
> Активист, какие ещё косяки, ты час отнимаешь.
Раньше я отнимал от 2011-04-01 один час (допустим чел из другого региона), получал 2011-03-31 - строго по мануалу! Сейчас так и осталось, но теперь мне нужно приводить это еще к виду без 23:00:00 при сравнениях!
 
Сверху