Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помощь с SQL запросом / 23 сообщений из 23, страница 1 из 1
25.12.2018, 18:35
    #39753017
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
Добрый день товарищи.случилась такая оказия ,никогда не работал с 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
25.12.2018, 19:43
    #39753063
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
Как вариант, при помощи TIMESTAMPDIFF() получить разность дат/времени в секундах, а затем с секундами выполнить арифметические действия.
...
Рейтинг: 0 / 0
25.12.2018, 19:50
    #39753067
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
vkle,
а как это на бумаге выглядит.я не знаком с синтаксисом mysql к сожалению,а он довольно прилично от sqlite отличается судя по всему.
select TIMESTAMPDIFF(now(),users.data) from users where UserId=999929921
даже на этот простой запрос воркбенч ругается
...
Рейтинг: 0 / 0
25.12.2018, 20:01
    #39753074
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
asv79,

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

Синтаксис мало отличается. То ли описание функции Вы прочитали только частично, то ли потеряли первый аргумент.
а как занести в таблицу локальное время? в склайте это 'now','localtime'
...
Рейтинг: 0 / 0
25.12.2018, 22:20
    #39753130
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
вообщем ответ был найден с помощью специалиста по 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
25.12.2018, 23:03
    #39753143
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
asv79
Код: sql
1.
timediff(

Осторожно, у этой функции ограничение в '838:59:59' часов/минут/секунд, т.е. чуть больше месяца.
...
Рейтинг: 0 / 0
26.12.2018, 00:22
    #39753168
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
Код: 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
26.12.2018, 13:42
    #39753401
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
miksoft,к сожалению вы правы и какой выход из данной ситуации?
...
Рейтинг: 0 / 0
26.12.2018, 13:43
    #39753403
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
miksoft,userdata всегда в прошлом 100%
...
Рейтинг: 0 / 0
26.12.2018, 13:49
    #39753406
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
asv79userdata всегда в прошлом 100%Если это не поддержано на уровне структуры (а оно не поддержано, ибо MySQL игнорирует CHECK CONSTRAINT) - то словам грош цена.
...
Рейтинг: 0 / 0
26.12.2018, 14:36
    #39753444
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
Akina,
Какое это имеет отношение к тому что timediff имеет интервал 34 дня всего?
Мне уже помогли,запрос работает ,нужно теперь победить функцию tumediff ,так как у меня в таблице будут значения и 2007 года,тобишь разница более 10 лет с текущей датой
...
Рейтинг: 0 / 0
26.12.2018, 14:41
    #39753449
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
Akinaasv79userdata всегда в прошлом 100%Если это не поддержано на уровне структуры (а оно не поддержано, ибо MySQL игнорирует CHECK CONSTRAINT) - то словам грош цена.
И да оно поддержано еще на уровне ввода даты,у пользователя физически ограничена возможность ввестм дату раньше 2001 года и позже текущей
...
Рейтинг: 0 / 0
26.12.2018, 15:27
    #39753463
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
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
26.12.2018, 15:32
    #39753467
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
Хотя для вычисления разницы в днях лучше воспользоваться выражением 21773477 от miksoft - ибо DATEDIFF чхал на время и может дать отрицательные часы.
...
Рейтинг: 0 / 0
26.12.2018, 18:21
    #39753579
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с SQL запросом
Akina,

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


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


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