За последние 24 часа нас посетили 18033 программиста и 1700 роботов. Сейчас ищут 1530 программистов ...

Помогите пожалуйста с выводом данных по дате

Тема в разделе "MySQL", создана пользователем victort, 24 янв 2018.

Метки:
  1. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Здравствуйте есть два поля в БД time_p (формат записи - 11:00:00) и date_p (формат записи - 2017-01-01) одно отвечает за время вывода а второе за дату. Помогите пожалуйста составить правильный sql-запрос. И что лучше всего использовать для проверки NOW() или другой оператор. Кстати к выбранному оператору надо будет прибавить 2 часа 30 минут так как есть разница во времени между сервером и нашим регионом.
    Я пытался сделать запрос вида ДАТА+ВРЕМЯ <= ТЕКУЩЕЕ ВРЕМЯ
    Код (Text):
    1.  (`data_p` +  `time_p`) <= NOW( )
    но вижу что знаний не хватает чтоб понять в чем ошибка
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    тип полей какой? только не говори, что VARCHAR :D
    во многих случаях MySQL умеет автоматически кастить строки в дату-время и наоборот, но лучше использовать "родные" типы колонок чтобы избежать трудноуловимых ошибок!

    для склейки строк в MySQL используется функция CONCAT() или CONCAT_WS(). да, вот так сложно всё!
    CONCAT_WS(' ', stringfield1, stringfield2)

    для изменения часового пояса CONVERT_TZ():
    CONVERT_TZ(datetimefield, 'system', 'Australia/Melbourne')

    добавить время можно с помощью ADDTIME(d, t) - здесь d это дата либо дата-время, а t это время, возможно с кусочком даты )))
    Код (Text):
    1.  
    2. mysql> SELECT ADDTIME('2008-05-15 13:20:32.50','2 1:39:27.50') as required_datetime;
    3. +----------------------------+
    4. | required_datetime          |
    5. +----------------------------+
    6. | 2008-05-17 15:00:00.000000 |
    7. +----------------------------+
    8. 1 row in set (0.00 sec)
    описание функций с примерами доступно на оффициальном сайте. https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
    --- Добавлено ---
    NOW() это не оператор, а функция. говори правильно.
    да, это годная функция если тебе надо сравнить с текущим временем. ну и помни о часовых поясах… просто выведи
    Код (Text):
    1. SELECT NOW()
    в консоли mysql и поймешь надо ли тебе что-то прибавлять-убавлять перед сравнением.
     
  3. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    artoodetoo какой varchar типы стандартные date и time соответственно. Ну извини NOW это действительно функция. Мне не склеить строки надо мне надо я так понимаю перевести их в секунды и сравнить с данной функцией. или благодаря склейке функция NOW правильно поймет полученую строчку
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    @victort
    > Ну извини
    не извиняйся. я только пытаюсь помочь. правильно сформулированный вопрос это половина ответа. ты ведь хочешь получать ответы?

    и я ответил тебе не только про строки ;)
     
  5. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    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 не знает эту функцию или что я ее неправильно написал?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    в "обратные одинарные кавычки" надо окружать каждое имя, а не цепочку целиком.

    `tabl`.`data_p`
     
  7. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    artoodetoo все равно пишет синтаксическая ошибка 1064
    --- Добавлено ---
    Походу это проблема в версии попробовал взять пример из страницы что ты мне кинул: SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00'); пишет ошибка 1064
     
  8. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Написал тогда вот так:
    Код (Text):
    1. SELECT*FROM`tab` WHERE`data_p`<=NOW() AND`time_p`<=(NOW() + INTERVAL 2 HOUR)
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Так пиши правильно и не будет синтаксических ошибок. Твой последний код логически неверный в принципе, хоть и без синтаксических ошибок.
    Старайся лучше, не косячь. Сфуяли вдруг ты вместо addtime использовал timestamp!
     
  10. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    artoodetoo а ты читай то что я пишу. Я же написал для теста взял готовый пример который должен был мне показать работает функция или нет. Пример показал что функция у меня не работает. Я ведь спросил может у меня версия MySQL стара? Че ругаться сразу - мне помощь нужна а не ругань.
     
  11. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    artoodetoo вот как у меня прописан addtime для теста: SELECT ADDTIME (`tab`.`data_p`,`tab`.`time_p`) Ошибка: 1064
    --- Добавлено ---
    artoodetoo посмотрел версию mysql - 4.0.27
     
  12. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    artoodetoo обратился я в техподдержку данного сервера и выяснил что данная функция мне не доступна.
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    wow, wow, wow! такое ещё бывает?! :) ещё более удивительно, что на таком ресурсе есть техподдержка. спрашивается какого болта они не обновятся!
     
  14. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Денег хотят. На новый тариф сайт перевожу тогда получаю более новую версию PHP и MySQL
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    советую сменить хостинг.
     
  16. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    заменили версию БД 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() вродебы работает сейчас интервал еще добавлю
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    @victort формат?! ещё раз спрошу: действительно ли ты используешь "родные" типы для даты и времени?

    http://sqlfiddle.com/#!9/38d109/2
    Код (Text):
    1.  
    2. CREATE TABLE test (
    3.   id INT NOT NULL AUTO_INCREMENT,
    4.   date_p DATE NOT NULL,
    5.   time_p TIME NOT NULL,
    6.   PRIMARY KEY (id)
    7. );
    8.  
    9. INSERT INTO test(date_p, time_p) VALUES
    10. ('2017-01-10', '10:38'),
    11. ('2017-05-18', '08:00'),
    12. ('2017-10-22', '12:12'),
    13. ('2018-01-12', '06:30');
    14.  
    15. SELECT ADDTIME(date_p, time_p)
    16. FROM test;
    Код (Text):
    1. | ADDTIME(date_p, time_p) |
    2. |-------------------------|
    3. |     2017-01-10 10:38:00 |
    4. |     2017-05-18 08:00:00 |
    5. |     2017-10-22 12:12:00 |
    6. |     2018-01-12 06:30:00 |
    работает как часы. ч.я.д.н.т. ?

    создай свою "пеcочницу" по аналогии с моей для демонстрации проблемы.
     
  18. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    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.
     
  19. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    artoodetoo тестирую другой хостинг там тоже тест SELECT ADDTIME ('2018-01-12', '06:30:00') выдает ошибку а точнее не правильный результат: 06:50:18. Поэтому мой запрос с клейкой помогает избежать этой ошибки и получить правильный результат.
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Я начинаю тебя бояться, @victort :eek:
    --- Добавлено ---
    Ты где-то жостко косячишь, но перед тем как выложить сюда пример, ты его адаптируешь так, что суть ускользает. Это плохая практика. Доказывать что-то или советовать в таких условиях не вижу смысла.
     
  21. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    artoodetoo я всего навсего в phpMyAdmin во вкладке SQL задал запрос и выложил ответ который получил. Есть вероятность того что данные строки если их задаешь напрямую считаются обычными строками а не строками формата дата поэтому я и получил такой неправильный ответ. А когда задаешь точное совпадение форматов то тогда все правильно получаешь. Кстати у меня функция CONCAT_WS() при тесте делала не склейку а замещение строк. И я ее также перед тем как использовать проверял в phpMyAdmin.
    И уж лучше наверное уточнить в чем я не прав чем гадать где ошибка. Быстрее получу ответ и больше совершать таких ошибок уже не буду.
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    а ты протестируй все варианты использования ADDTIME():
    1) когда первый аргумент это строка '2018-01-12'
    2) когда там DATE('2018-01-12')
    3) когда там поле типа DATE или DATETIME
    и дальше будет понятно что делать
     
  23. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    хорошо.