Форум русскоязычного сообщества Ubuntu


За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: сравнение дат. SQL  (Прочитано 6854 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 4te

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
сравнение дат. SQL
« : 23 Май 2010, 23:07:45 »
народ, нужна помощь по sql.
есть таблица с забаненными пользователями в которой есть ник, начала бана, конец бана. и надо посмотреть не пересекаются ли даты. т.е. был ли забанен пользователь до истечения уже данного ему бана.

Оффлайн gantellus

  • Старожил
  • *
  • Сообщений: 1276
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #1 : 23 Май 2010, 23:44:47 »
сделать запрос - вывести все записи, где дата забана больше, чем дата разбана :)

если вопрос в том, как именно это сделать, могу дать учебник хороший..
Придумайте ещё более дружественный интерфейс, и мир породит ещё более тупого юзера (с)
С2Duo 2.4 Ghz, Geforce 8800, Maya 44 PCI

Оффлайн 4te

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #2 : 24 Май 2010, 00:06:19 »
сделать запрос - вывести все записи, где дата забана больше, чем дата разбана :)

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

а как сравнить даты из разных строк??? т.е. есть ситуация:
nick                   date_start             date_limit           admin
----------------------------------------------------------------------
user1               2008-01-01          2008-02-01        admin1
user1               2008-01-15          2008-02-15        admin1

вообще надо вывести ник админа который забанил какого-либо пользователя до истечения срока бана, установленного им же тому же пользователю.... но я не понимаю  как проверять пересечение дат правильно...  :-\
« Последнее редактирование: 24 Май 2010, 00:09:05 от 4te »

Оффлайн gantellus

  • Старожил
  • *
  • Сообщений: 1276
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #3 : 24 Май 2010, 00:14:00 »
подозреваю, что тут надо использовать подзапросы... сейчас времени нет, завтра напишу, если никто не опередит)
Придумайте ещё более дружественный интерфейс, и мир породит ещё более тупого юзера (с)
С2Duo 2.4 Ghz, Geforce 8800, Maya 44 PCI

Оффлайн 4te

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #4 : 24 Май 2010, 00:18:18 »
да, у меня такая мысля тоже была) думаю стоит копать в этом направлении...

сейчас времени нет, завтра напишу, если никто не опередит)
буду очень благодарен  :)

Оффлайн Каметон

  • Участник
  • *
  • Сообщений: 214
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #5 : 24 Май 2010, 00:24:53 »
надо посмотреть не пересекаются ли даты. т.е. был ли забанен пользователь до истечения уже данного ему бана.
А зачем? В чем общая (конечная) цель задачи?

Оффлайн 4te

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #6 : 24 Май 2010, 00:34:16 »
надо посмотреть не пересекаются ли даты. т.е. был ли забанен пользователь до истечения уже данного ему бана.
А зачем? В чем общая (конечная) цель задачи?
надо вывести ник админа который забанил какого-либо пользователя до истечения срока бана, установленного им же тому же пользователю
т.е. есть строки образца как я выше писал... нужны ники админов которые банили уже забаненого пользователя...

Оффлайн ABEgorov

  • Участник
  • *
  • Сообщений: 130
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #7 : 24 Май 2010, 08:32:43 »
SELECT B1.nick, B1.date_start AS ds1, B1.date_limit AS dl1, B1.admin AS a1, B2.date_start AS ds2, B2.date_limit AS dl2, B2.admin AS a2
FROM Bans AS B1 INNER JOIN Bans AS B2
ON B1.nick=B2.nick AND B1.admin <> B2.admin AND B2.date_start BETWEEN B1.date_start AND B1.date_limit

Пользователь решил продолжить мысль 24 Май 2010, 05:12:03:
ЗЫ: это был неправильный запрос с несколькими ошибками. Хотя в нём есть идея, как находить пересечения дат.  Правильный запрос длинноват будет.

Пользователь решил продолжить мысль 24 Май 2010, 08:36:59:
Что-то вроде (при условии, что date_start<date_limit):
SELECT T.nick, ban_start, ban_end, date_start, date_limit, admin
FROM
 (SELECT T.nick, ban_start, ban_end
  FROM
   (SELECT T1.nick, ban_start, MIN(ban_end) AS ban_end
    FROM
     (SELECT nick, date_start AS ban_start
      FROM Bans AS B1
      WHERE NOT EXISTS
         (SELECT *
          FROM Bans AS B2
          WHERE B2.nick=B1.nick AND B1.date_start>B2.date_start AND B1.date_start<=B2.date_limit)) AS T1
      INNER JOIN
     (SELECT nick, date_limit AS ban_end
      FROM Bans AS B1
      WHERE NOT EXISTS
         (SELECT *
          FROM Bans AS B2
          WHERE B2.nick=B1.nick AND B1.date_limit<B2.date_limit AND B1.date_limit>=B2.date_start)) AS T2
      ON T1.nick=T2.nick
    WHERE ban_end>=ban_start
    GROUP BY T1.nick, ban_start) AS T
    INNER JOIN Bans AS B ON T.nick=B.nick AND B.date_start BETWEEN ban_start AND ban_end
    GROUP BY T.nick, ban_start, ban_end, HAVING COUNT(B.nick)>1) AS T
  INNER JOIN Bans AS B ON T.nick=B.nick AND B.date_start BETWEEN ban_start AND ban_end
PS: запрос не проверял, так, что могут быть различные ошибки. Думаю идея должна быть понятна - находим интервал бана (ban_start, ban_end), а потом все даты входящие в этот интервал и из них отсеиваем интервалы с одной датой :)
« Последнее редактирование: 24 Май 2010, 10:40:03 от ABEgorov »

Оффлайн 4te

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: сравнение дат. SQL
« Ответ #8 : 26 Май 2010, 16:11:19 »
народ, спасибо! разобрался)

 

Страница сгенерирована за 0.056 секунд. Запросов: 22.