Здравствуйте есть два поля в БД time_p (формат записи - 11:00:00) и date_p (формат записи - 2017-01-01) одно отвечает за время вывода а второе за дату. Помогите пожалуйста составить правильный sql-запрос. И что лучше всего использовать для проверки NOW() или другой оператор. Кстати к выбранному оператору надо будет прибавить 2 часа 30 минут так как есть разница во времени между сервером и нашим регионом. Я пытался сделать запрос вида ДАТА+ВРЕМЯ <= ТЕКУЩЕЕ ВРЕМЯ Код (Text): (`data_p` + `time_p`) <= NOW( ) но вижу что знаний не хватает чтоб понять в чем ошибка
тип полей какой? только не говори, что VARCHAR во многих случаях MySQL умеет автоматически кастить строки в дату-время и наоборот, но лучше использовать "родные" типы колонок чтобы избежать трудноуловимых ошибок! для склейки строк в MySQL используется функция CONCAT() или CONCAT_WS(). да, вот так сложно всё! CONCAT_WS(' ', stringfield1, stringfield2) для изменения часового пояса CONVERT_TZ(): CONVERT_TZ(datetimefield, 'system', 'Australia/Melbourne') добавить время можно с помощью ADDTIME(d, t) - здесь d это дата либо дата-время, а t это время, возможно с кусочком даты ))) Код (Text): mysql> SELECT ADDTIME('2008-05-15 13:20:32.50','2 1:39:27.50') as required_datetime; +----------------------------+ | required_datetime | +----------------------------+ | 2008-05-17 15:00:00.000000 | +----------------------------+ 1 row in set (0.00 sec) описание функций с примерами доступно на оффициальном сайте. https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html --- Добавлено --- NOW() это не оператор, а функция. говори правильно. да, это годная функция если тебе надо сравнить с текущим временем. ну и помни о часовых поясах… просто выведи Код (Text): SELECT NOW() в консоли mysql и поймешь надо ли тебе что-то прибавлять-убавлять перед сравнением.
artoodetoo какой varchar типы стандартные date и time соответственно. Ну извини NOW это действительно функция. Мне не склеить строки надо мне надо я так понимаю перевести их в секунды и сравнить с данной функцией. или благодаря склейке функция NOW правильно поймет полученую строчку
@victort > Ну извини не извиняйся. я только пытаюсь помочь. правильно сформулированный вопрос это половина ответа. ты ведь хочешь получать ответы? и я ответил тебе не только про строки
artoodetoo c функцие NOW() разобрался делаю так: NOW() + INTERVAL 2 HOUR а вот при выполнении функции ADDTIME() выдается синтаксическая ошибка: ADDTIME(date_p, time_p) я ведь правильно понял я к дате прибавляю время и сравниваю ее с текущим временем. Попробовал даже вот так написать: SELECT ADDTIME(`tabl.data_p`, `tabl.time_p`) Код ошибки: #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(`tab.data_p`, `tab.time_p`)' at li Это означает что моя версия MySQL не знает эту функцию или что я ее неправильно написал?
artoodetoo все равно пишет синтаксическая ошибка 1064 --- Добавлено --- Походу это проблема в версии попробовал взять пример из страницы что ты мне кинул: SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00'); пишет ошибка 1064
Написал тогда вот так: Код (Text): SELECT*FROM`tab` WHERE`data_p`<=NOW() AND`time_p`<=(NOW() + INTERVAL 2 HOUR)
Так пиши правильно и не будет синтаксических ошибок. Твой последний код логически неверный в принципе, хоть и без синтаксических ошибок. Старайся лучше, не косячь. Сфуяли вдруг ты вместо addtime использовал timestamp!
artoodetoo а ты читай то что я пишу. Я же написал для теста взял готовый пример который должен был мне показать работает функция или нет. Пример показал что функция у меня не работает. Я ведь спросил может у меня версия MySQL стара? Че ругаться сразу - мне помощь нужна а не ругань.
artoodetoo вот как у меня прописан addtime для теста: SELECT ADDTIME (`tab`.`data_p`,`tab`.`time_p`) Ошибка: 1064 --- Добавлено --- artoodetoo посмотрел версию mysql - 4.0.27
wow, wow, wow! такое ещё бывает?! ещё более удивительно, что на таком ресурсе есть техподдержка. спрашивается какого болта они не обновятся!
заменили версию БД timeadd работает но только если у даты вот такой формат 2018-12-16 00:00:00 А у моей даты формат 2018-12-16 Если пробовать CONCAT чтоб сделать вот так: SELECT CONCAT ('2018-01-24',' 00:00:00'). тоесть привести дату к данному формату то всеравно не получается. Немогу отследить склейку если пишу SELECT CONCAT (`tab`.`data_p`,' 00:00:00'). В чем может быть загвозка. Пишет что такой таблици нет. --- Добавлено --- Короче написал вот так: SELECT* FROM tab WHERE ADDTIME(CONCAT(data_n,' 00:00:00'),time_p)<=(NOW() вродебы работает сейчас интервал еще добавлю
@victort формат?! ещё раз спрошу: действительно ли ты используешь "родные" типы для даты и времени? http://sqlfiddle.com/#!9/38d109/2 Код (Text): CREATE TABLE test ( id INT NOT NULL AUTO_INCREMENT, date_p DATE NOT NULL, time_p TIME NOT NULL, PRIMARY KEY (id) ); INSERT INTO test(date_p, time_p) VALUES ('2017-01-10', '10:38'), ('2017-05-18', '08:00'), ('2017-10-22', '12:12'), ('2018-01-12', '06:30'); SELECT ADDTIME(date_p, time_p) FROM test; Код (Text): | ADDTIME(date_p, time_p) | |-------------------------| | 2017-01-10 10:38:00 | | 2017-05-18 08:00:00 | | 2017-10-22 12:12:00 | | 2018-01-12 06:30:00 | работает как часы. ч.я.д.н.т. ? создай свою "пеcочницу" по аналогии с моей для демонстрации проблемы.
artoodetoo могу только на это ответить - Хост тот же - может это их косяк. А перед тем как создать данную команду я делал тест через phpMyAdmin где писал запрос SELECT ADDTIME ('2018-01-12', '06:30:00') выдал ошибку тогда я написал SELECT ADDTIME ('2018-12-16 00:00:00', '06:30:00') сработало. Я думал ты мне напишешь а почему сразу я не применяю SELECT CONCAT (`data_p`,`time_p`) - на это отвечу потому что склейка получается без пробела и формат ломается потому что результат будет '2018-01-1206:30:00'. Проверить работу бд на сервере я могу только через phpMyAdmin.
artoodetoo тестирую другой хостинг там тоже тест SELECT ADDTIME ('2018-01-12', '06:30:00') выдает ошибку а точнее не правильный результат: 06:50:18. Поэтому мой запрос с клейкой помогает избежать этой ошибки и получить правильный результат.
Я начинаю тебя бояться, @victort --- Добавлено --- Ты где-то жостко косячишь, но перед тем как выложить сюда пример, ты его адаптируешь так, что суть ускользает. Это плохая практика. Доказывать что-то или советовать в таких условиях не вижу смысла.
artoodetoo я всего навсего в phpMyAdmin во вкладке SQL задал запрос и выложил ответ который получил. Есть вероятность того что данные строки если их задаешь напрямую считаются обычными строками а не строками формата дата поэтому я и получил такой неправильный ответ. А когда задаешь точное совпадение форматов то тогда все правильно получаешь. Кстати у меня функция CONCAT_WS() при тесте делала не склейку а замещение строк. И я ее также перед тем как использовать проверял в phpMyAdmin. И уж лучше наверное уточнить в чем я не прав чем гадать где ошибка. Быстрее получу ответ и больше совершать таких ошибок уже не буду.
а ты протестируй все варианты использования ADDTIME(): 1) когда первый аргумент это строка '2018-01-12' 2) когда там DATE('2018-01-12') 3) когда там поле типа DATE или DATETIME и дальше будет понятно что делать