powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помощь с SQL запросом
23 сообщений из 23, страница 1 из 1
Помощь с SQL запросом
    #39753017
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день товарищи.случилась такая оказия ,никогда не работал с my sql и тут понадобилось перевести БД из sqlite в my sql
вроде ничего сложного,но никак не могу победить один запрос
вообщем ситуация такая имеем в таблице некое значение даты ( тип datetime)
нужно от текущей даты-времени и этой даты в таблице высчитать разницу и вывести пользователю в виде
00д 00ч 00 м

в sqlite у меня был запрос вот такой

Код: sql
1.
2.
3.
4.
5.
SELECT 
    CAST((strftime('%s', 'now','localtime') - strftime('%s',  users.date))/(60 * 60 * 24) AS TEXT) || ' ' || 
    CAST(((strftime('%s', 'now','localtime') - strftime('%s', users.date)) % (60 * 60 * 24))/(60 * 60) AS TEXT) || ':' || 
    CAST((((strftime('%s', 'now','localtime') - strftime('%s',  users.date)) % (60 * 60 * 24)) % (60 * 60))/60 AS TEXT)
from users where userId=123421 ;

как такое повторить в mysql ?

И второй вопрос как задать локальное время -функция Now() и localtime() выдают GMT ,может изза того что физически база данных находится в европе или все же есть какие то способы записать локальное время клиента?
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753063
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, при помощи TIMESTAMPDIFF() получить разность дат/времени в секундах, а затем с секундами выполнить арифметические действия.
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753067
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,
а как это на бумаге выглядит.я не знаком с синтаксисом mysql к сожалению,а он довольно прилично от sqlite отличается судя по всему.
select TIMESTAMPDIFF(now(),users.data) from users where UserId=999929921
даже на этот простой запрос воркбенч ругается
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753074
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79,

Синтаксис мало отличается. То ли описание функции Вы прочитали только частично, то ли потеряли первый аргумент.
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753076
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, секунды Вам и не нужны. В принципе, разницу сразу в минутах можно получить, а потом арифметика...
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753125
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleХотя, секунды Вам и не нужны. В принципе, разницу сразу в минутах можно получить, а потом арифметика...
ну вот хотя бы такой запрос
select TIMESTAMPDIFF(minute ,now(),users.data) from users where UserId=999929921
первая дат больше второй-возвращает отрицательное число...
как дальше прикрутить в один запрос всю математику я понятия просто не имею .в склайте это делается на раз два
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753126
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleasv79,

Синтаксис мало отличается. То ли описание функции Вы прочитали только частично, то ли потеряли первый аргумент.
а как занести в таблицу локальное время? в склайте это 'now','localtime'
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753130
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщем ответ был найден с помощью специалиста по MySQL и выглядит это вот так

Код: sql
1.
2.
3.
4.
5.
6.
select concat(lpad(floor((@h:=time_format(@tm:=timediff(now(), users.data), '%H'))/24), 2, '0'),
              ' д ',
              lpad(@h % 24, 2, '0'),
              ' ч ',
              time_format(@tm, '%i') ,' м ')
from users where UserId=999929921;



выводится разница в днях ,часах ,минутах.
если говорить о похожем синтаксисе в склайте тот же код
Код: sql
1.
2.
3.
4.
5.
SELECT 
CAST((strftime('%s', 'now','localtime') - strftime('%s', users.date))/(60 * 60 * 24) AS TEXT) || ' ' || 
CAST(((strftime('%s', 'now','localtime') - strftime('%s', users.date)) % (60 * 60 * 24))/(60 * 60) AS TEXT) || ':' || 
CAST((((strftime('%s', 'now','localtime') - strftime('%s', users.date)) % (60 * 60 * 24)) % (60 * 60))/60 AS TEXT)
from users where userId=123421 ;
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753143
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
Код: sql
1.
timediff(

Осторожно, у этой функции ограничение в '838:59:59' часов/минут/секунд, т.е. чуть больше месяца.
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753168
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
SELECT CONCAT(TO_DAYS(NOW())-TO_DAYS(users.date), 'д ', DATE_FORMAT(ADDTIME('2000-01-01 00:00:00',TIMEDIFF(NOW(), users.date)), '%Hч %Iс'))
from users where userId=123421

Если users.date всегда в прошлом, то можно так.
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753401
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,к сожалению вы правы и какой выход из данной ситуации?
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753403
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,userdata всегда в прошлом 100%
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753406
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79userdata всегда в прошлом 100%Если это не поддержано на уровне структуры (а оно не поддержано, ибо MySQL игнорирует CHECK CONSTRAINT) - то словам грош цена.
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753444
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
Какое это имеет отношение к тому что timediff имеет интервал 34 дня всего?
Мне уже помогли,запрос работает ,нужно теперь победить функцию tumediff ,так как у меня в таблице будут значения и 2007 года,тобишь разница более 10 лет с текущей датой
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753449
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaasv79userdata всегда в прошлом 100%Если это не поддержано на уровне структуры (а оно не поддержано, ибо MySQL игнорирует CHECK CONSTRAINT) - то словам грош цена.
И да оно поддержано еще на уровне ввода даты,у пользователя физически ограничена возможность ввестм дату раньше 2001 года и позже текущей
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753463
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79оно поддержано еще на уровне ввода датыЕрунда. Всё равно что нигде.

asv79Какое это имеет отношение к тому что timediff имеет интервал 34 дня всего?Именно к этому моменту - никакого.


asv79высчитать разницу и вывести пользователю в виде
00д 00ч 00 м
Код: sql
1.
CONCAT(DATEDIFF(@date2, @date1), 'д ', REPLACE(LEFT(TIMEDIFF(@date2, @date1 + INTERVAL DATEDIFF(@date2, @date1) DAY), 5), ':', 'ч '), 'м')
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753467
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя для вычисления разницы в днях лучше воспользоваться выражением 21773477 от miksoft - ибо DATEDIFF чхал на время и может дать отрицательные часы.
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753579
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

спасибо большое ,ваш запрос считает идеально
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753585
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
этот запрос считает некорректно,к примеру тест две даты с дельтой 10 минут -запрос возвращает разницу 23 часа
там где то ошибка сидит практически в сутки .а ваш запрос просто идеален.огромное вам спасибо.
если еще подскажите как заставить mysql русские буквы читать,писать поставлю вам памятник)
таблица натроена utf8 ,столбец тоже ,в pom.xml -unt8
суть проблемы вот тут изложил
https://ru.stackoverflow.com/questions/925664/
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753590
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaХотя для вычисления разницы в днях лучше воспользоваться выражением 21773477 от miksoft - ибо DATEDIFF чхал на время и может дать отрицательные часы.
этот запрос не считает каким то непонятным образом и дает некоректную разницу
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753603
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Код: sql
1.
CONCAT(DATEDIFF(@date2, @date1), 'д ', REPLACE(LEFT(TIMEDIFF(@date2, @date1 + INTERVAL DATEDIFF(@date2, @date1) DAY), 5), ':', 'ч '), 'м')


вот это 100% рабочий вариант
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753618
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят у кого будет проблема с кирилицей ,вся суть лежит в jdbc,при создании подключения нужно прописать руками вот такой текст в конец вашего url
?useUnicode=true&characterEncoding=UTF-8
...
Рейтинг: 0 / 0
Помощь с SQL запросом
    #39753743
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79запрос считает некорректно,к примеру тест две даты с дельтой 10 минут -запрос возвращает разницу 23 часаНу собсно я и указал, что вместо DATEDIFF надо использовать разность TO_DAYS, как у Майка. Просто DATEDIFF перед вычислением разности тупо отбрасывает время, а потому когда время в первом аргументе меньше, чем во втором, получается плюс день, и соответственно считается отрицательное время.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помощь с SQL запросом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]