Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2012, 11:30   #1
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
Сообщение MySQL ближайшая дата к указанной

вот столкнулся с задачей. и никак не могу решить как лучше сделать.
хотелось бы сделать на стороне сервера процедурой но как её писать я просто пока не могу представить. но это так в перспективе.

задача.
есть таблица со столбцами par1, par2, par3, data1 (тип date), time1 (тип time), val1 (тип float).
необходимо выбрать значения интервале -+15 минут ближайшей к указанной дате.

то есть запрос получается что то вроде запроса из дельфи.
Код:
 query:= 'select data1, time1, val from '+base+' where par1='+s1+' and par2='+s2+' and par3='+s3+' and '+
       '((data1='''+trim(DateToStr(dat_1))+''' and time1<='''+TimeToStr(vrem_1)+''')or(data1<'''+trim(DateToStr(dat_1))+''' ))and '+
       '((data1='''+trim(DateToStr(dat))+''' and time1>='''+TimeToStr(vrem)+''')or(data1>'''+trim(DateToStr(dat))+''' )) order  by data1 , time1 limit 20';
где
дата начала dat и vrem
дата конечного интервала dat_1 и vrem_1
эти даты высчитываются от заданной даты пользователем в программе.

как составить запрос что бы он вернул одну строку ближайшую к дате и времени указанной пользователем.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 06.07.2012 в 11:32.
IliaIT вне форума Ответить с цитированием
Старый 06.07.2012, 11:46   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что-то типа вычисляемого поля с ABS разницы даты-времени заданной и из таблицы, ORDER по этой разнице с DESC и LIMIT 1. Предполагаю, что MySQL может реализовать такое вычисляемое поле

Добавил - DESC лишний
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.07.2012 в 11:50.
Аватар вне форума Ответить с цитированием
Старый 06.07.2012, 11:54   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар, как обычно, в точку! +1

p.s. возможно что можно поможет даже запрос
Код:
select MIN(ABS(ДатаВремя1 - ДатаВремяЧтоНАдо)) from откуда_надо
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2012, 12:04   #4
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

напомните как составить запрос , точнее соединить дату и время в mysql.
ДатаВремя1=data1+time1 но как это в запросе сделать? а остальной запрос после from без изменений?
просто вся эта задача выплыла из того что время и дата хранятся в разных столбцах, а не едином столбце датавремя. из за этого и получилось длинное условие на дату и время.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 06.07.2012, 13:53   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

очень всё сильно зависит от того, В КАКОМ формате у Вас хранится data1 и time1...

я бы посмотрел в сторону TIMESTAMP(expr1,expr2)

да и посмотрите функции MySQL для работы с датой/временем - тут или тут...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2012, 15:11   #6
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

как писалось выше данные находятся в формате date и time
Цитата:
Сообщение от IliaIT Посмотреть сообщение
...
задача.
есть таблица со столбцами par1, par2, par3, data1 (тип date), time1 (тип time), val1 (тип float).
...
или вот строки из создания таблицы
Код:
  `data1` date NOT NULL DEFAULT '0000-00-00',
  `time1` time NOT NULL DEFAULT '00:00:00',
а вообще буду смотреть на сейчас на функции работы со временем, и пробовать разные варианты.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 06.07.2012, 15:59   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я бы начал с того, что попробовал, что возвращает запрос:
Код:
select TIMESTAMP(date1,time1) as dt1, ....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2012, 16:49   #8
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

создал таблицу и сделал к ней запрос

Код:
select 
TIMESTAMP(`data`,`time`) as dt1,
TIMESTAMP('2012-07-01 00:00:00') as dt11,
`data`+`time` as dt12, val from `kod_48` 
where kod=48 and unitnum=514 and id_param=101 and 
((data='2012-07-01' and time<='0:15:00')or(data<'2012-07-01' ))and 
((data='2012-06-30' and time>='23:45:00')or(data>'2012-06-30' ));
получил
'2012-06-30 23:50:44', '2012-07-01 00:00:00', '20355674', '2954.76'
'2012-06-30 23:59:02', '2012-07-01 00:00:00', '20356532', '2954.92'
'2012-07-01 00:07:21', '2012-07-01 00:00:00', '20121422', '2955.08'

видим что нужная строка это строка со значением '2012-06-30 23:59:02','2954.92'
так как заданная дата '2012-07-01 00:00:00'

теперь ставим условие мин
Код:
select 
min(ABS(TIMESTAMP(`data`,`time`) - TIMESTAMP('2012-07-01 00:00:00'))),
TIMESTAMP(`data`,`time`) as dt1,
TIMESTAMP('2012-07-01 00:00:00') as dt11,
`data`+`time` as dt12, val from `arhiv`.`kod_48` 
where kod=48 and unitnum=514 and id_param=101 and 
((data='2012-07-01' and time<='0:15:00')or(data<'2012-07-01' ))and 
((data='2012-06-30' and time>='23:45:00')or(data>'2012-06-30' ));
получаем
'70764956.000000', '2012-06-30 23:50:44', '2012-07-01 00:00:00', '20355674', '2954.76'

это не то что надо. где намудрил я?

а ну нафиг всё до понедельника пошёл отдыхать
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 06.07.2012 в 16:49. Причина: конец рабочего дня и недели :)
IliaIT вне форума Ответить с цитированием
Старый 06.07.2012, 17:23   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я бы пошел в таком направлении
Код:
SELECT ABS(TIMESTAMP(`data`,`time`)-TIMESTAMP('2012-07-01 00:00:00')) AS Delta,...
  FROM `arhiv`.`kod_48`
  where kod=48 and unitnum=514 and id_param=101 and
        TIMESTAMP(`data`,`time`) BETWEEN TIMESTAMP('2012-06-30 23:45:00') AND TIMESTAMP('2012-07-01 00:15:00')
  ORDER BY 1
  LIMIT 1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.07.2012, 08:16   #10
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

Проверил. не работает так как задумано было.
Код:
SELECT ABS(TIMESTAMP(`data`,`time`)-TIMESTAMP('2012-07-01 00:00:00')) AS Delta,
TIMESTAMP(`data`,`time`), val 
  FROM `arhiv`.`kod_48`
  where kod=48 and unitnum=514 and id_param=101 and
        TIMESTAMP(`data`,`time`) BETWEEN TIMESTAMP('2012-06-30 23:45:00') AND TIMESTAMP('2012-07-01 00:15:00')
  ORDER BY Delta
  LIMIT 10
получили
'721.000000', '2012-07-01 00:07:21', '2955.08'
'70764098.000000', '2012-06-30 23:59:02', '2954.92'
'70764956.000000', '2012-06-30 23:50:44', '2954.76'

как видим, почему то не сортирует результат по вычисленному полю.
может как то не правильно пользуюсь функцией?

ой, то есть сортирует но вычисляет не то. нужное нам число больше на 5 порядков чем минимальное.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 09.07.2012 в 08:27. Причина: чего то не проснулся. и неправельно поглядел.
IliaIT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi MySQL - криво вводится дата в таблицу. iskurt Помощь студентам 10 13.06.2012 21:00
Дата в mysql Mortimoro PHP 2 18.04.2012 20:45
Ближайшая точка к курсору Claster Помощь студентам 11 27.07.2011 17:29
Вычитание дат(дата-дата=кол.дней) zallza Общие вопросы Delphi 1 31.05.2010 22:50
Ближайшая точка к заданной. Язык си MirandaX Помощь студентам 6 26.05.2009 18:25