За последние 24 часа нас посетили 22799 программистов и 1271 робот. Сейчас ищут 834 программиста ...

репозитарий полезных SQL запросов/процедур/функций

Тема в разделе "MySQL", создана пользователем Psih, 9 мар 2007.

  1. Anonymous

    Anonymous Guest

    ОФФТОП И ФЛУД.
    vb, забань сам себя =)
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Код (Text):
    1. echo strftime('%c',strtotime('14 december 1901'));
    возвращает:
    Код (Text):
    1. 14.12.1901 0:00:00
    что я делаю не так? :)

    отрицательные метки времени определённо работают на winXP sp2, впрочем, это не шибко актуально...
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    зато каждый день перелопачиваешь всю базу. зачем? а если нужно вывести счётчик: "до вашего дня рождения осталось ** дней, ** часов, ** минут и ** секунд"? будешь каждую секунду перелапачивать всю базу? :)

    ага, твои вычисления сильно грузят сервак. :)


    Код (Text):
    1. select * from users where nextbirthday between $now and $nowplus30day
    Код (Text):
    1. date('Y')-date('Y',$birthday);
     
  4. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Я разрешил ему (vb) разрешил побаловаться, так что все ок ;)
     
  5. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    dark-demon
    Но что бы выбрать этих пользователей, в базе должно быть записано сколько дней у человека до дня рождения :)
    Между прочим
    Код (Text):
    1. SELECT * FROM users WHERE prf_days_left <= 30;
    Он тупо быстрее отработает чем с BETWEEN :)
     
  6. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Psih, экономия на спичках. и коли уж упрощать, то по максимуму:
    Код (Text):
    1. SELECT * FROM users WHERE birthday_in_next_30_day = 1;
    :)
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    А вот это большая глупость, потому что ты не можешь сказать точно сколько дней осталось до дня рождения! Может завтра, а может через неделю. А может сегодня :D
     
  8. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    нет не большая он просто пошел по твоему пути ты ведь свою процедуру запускаешь раз в сутки ;)
    кто мешает dark-demon-у так же записывать количество дней до ДР?
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    А чем плох запуск раз в сутки?
     
  10. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    в данной задаче, ничем.
     
  11. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    в постановке задачи этого небыло :)

    плох не запуск раз в сутки (его по любому делать), а то, что ты раз в сутки меняешь данные из каждой записи, без особой на то необходимости.
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Дык, а ведь так и надо делать, потому что раз в сутки инфа для каждой записи меняеться. Именно раз в сутки, а не каждый запрос!
     
  13. avm

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

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    Это очень полезно делать например по какой-нибудь базе жителей Москвы.
    Может стоить подходить к вопросу с точки зрения баланса между значимостью инфы и частотой её востребованности? Нах вообще ежесуточно грузить большую базу и получать пинки от хостера только для того чтобы знать сколько дней осталось до дня рождения какого-то чела?
     
  14. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    кнопка для нажимания ;)
     
  15. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Ну не вы же строите сайт, вам не вдомёк зачем это надо :p
    Я постанул кусок кода, довольно полезный. Вам не надо, а кому-то может понадобиться.
     
  16. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    На самом деле все решается одним SQL запросом, естественно в разных БД он будет выглядеть по разному, вот пример для MSSQL, может и коряво, но работает:

    [sql]SELECT CASE isdate(convert(char(2),a.date1, 1) + '-' +
    convert(char(2),a.date1, 3) + '-' +
    str(YEAR(getdate())))
    When 1 then
    DATEDIFF(day, convert(datetime, str(YEAR(getdate()))+
    convert(char(2),a.date1, 1)+
    convert(char(2),a.date1, 3), 8),getdate())
    Else
    DATEDIFF(day, convert(datetime, str(YEAR(getdate()))+
    convert(char(2),a.date1, 1)+
    convert(char(2),a.date1-1, 3), 8)+1,getdate())
    End
    FROM proba_date a [/sql]


    В таблице proba_date, поле date1 - день рождения человека, соответственно запрос возвращает количество дней прошедших со дня рождения - это будут положительные числа и соответственно сколько осталось до дня рождения - это будут отрицательные числа, 0 означает что день рождения сегодня.