Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 82
от 27.04.2006, 00:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 278, Экспертов: 38
В номере:Вопросов: 1, Ответов: 4


Вопрос № 40959: Доброго времени суток, господа эксперты! Посоветуйте, как лучше сделать. Есть таблица с полем даты рождения datarojd date default 00000000 1. Какой должен быть запрос, чтоб можно было искать только по году, или по месяцу, или по дню. ...

Вопрос № 40.959
Доброго времени суток, господа эксперты!
Посоветуйте, как лучше сделать.
Есть таблица с полем даты рождения
datarojd date default 00000000
1. Какой должен быть запрос, чтоб можно было искать только по году, или по месяцу, или по дню. Или по нескольким сразу. ? и * не заменяется.
2. Может, как-то можно разъединить этот столбец на три?
Отправлен: 21.04.2006, 21:16
Вопрос задал: Mikhail_m (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Mikhail_m!

А на чем у тебя БД сделана?
В SQL нет, хотя в процедуре можно разделить, но в FB есть внешние функции:

f_DayOfMonth - день месяца
f_DayOfWeek - день недели
f_DayOfYear - день года
f_Month - месяц
f_Quarter - квартал
f_WeekOfYear - неделя года
f_Year date - год

Тогда можно написать запрос например так:

Select f_Month(Date) from Table where f_Month(Date)>7 or f_Month(Date)<4
Ответ отправил: Архангельский Андрей Германович (статус: Практикант)
Ответ отправлен: 21.04.2006, 21:29
Оценка за ответ: 5
Комментарий оценки:
У меня mysql. А вообще, хотелось обойтись стандартными sql-командами

Отвечает: Madproger
Здравствуйте, Mikhail_m!

Не знаю какая у Вас ДБ, но на примере Мускула искать можно так
если год
WHERE DATE_FORMAT(date, "%Y")='...'
если год и месяц
WHERE DATE_FORMAT(date, "%Y%m")=CONCAT('your_year', 'your_month')... и т.д.

Если не мускул - то думаю эти функции практически стандарт. А разделять на три поля - не есть хорошо

---------
И будет вам счАстиЕ!
Ответ отправил: Madproger (статус: 3-ий класс)
Ответ отправлен: 21.04.2006, 23:26
Оценка за ответ: 5
Комментарий оценки:
Спасибо. У меня как раз
mysql Ver 12.22 Distrib 4.0.20, for pc-linux-gnu (i686)
Хочется чисто на sql. Это все таки стандарт.

Отвечает: Филатов Евгений Геннадьевич
Здравствуйте, Mikhail_m!

Если таблица сделана в MS ACCESS или MS SQL, то значение по умолчанию должно соответствовать какой-либо дате. В любом случае значение поля занимает в памяти 8 байт для полного формата (дата+время) либо 4 байта для краткого формата (только дата или время), причем в формате, отличном от выводимого на экран. В Вашем примере значение поля по умолчанию может быть "1.1.1900 0:00:00". Желательно указать конкретную дату, например "1.1.2000.".

СУБД автоматически может определить день, месяц, год либо другой параметр даты, введенной в поле. Для отбора в языке SQL имеются стандартные функции:
Day(имя_поля) - день месяца
Month(имя_поля) - месяц
Year(имя_поля) - год
GetDate() - текущая дата и время в стандартном формате (можно использовать и при создании таблицы, например CREATE TABLE T1 (Имя_поля_с_датой datetime DEFAULT GETDATE() )
DateName(Параметр_даты, Дата) - возвращает специфический параметр даты в виде текста, например DateName(month, getdate()) возвратит "Апрель"
DatePart(Параметр_даты, Дата) - то же самое, только в виде числа, например DatePart(month, getdate()) возвратит 4
DateDiff(Параметр_даты, Дата_от, Дата_до) - возвращает разницу между конечной и начальной датой в заданных единицах измерения
DateAdd(Параметр_даты,Количество, Дата) - прибавит к указанной дате нужное количество единиц измерения.

Все эти функции можно широко использовать в SQL запросах, как пример посмотрите вопрос № 38282, а ниже приведу мой ответ автору вопроса, который не попал в рассылку:

В базе создал таблицу BASE с полями DNAC и DPOS типа даты,
занес несколько значений и запустил запрос
SELECT dnac,dpos,
int(datediff('m',dnac,dpos-iif(day(dnac)>day(dpos),1,0/12) AS god,
datediff('m',dnac,dpos)-iif(day(dnac)>day(dpos),1,0 mod 12) AS mes,
(
int(datediff('m',dnac,dpos-iif(day(dnac)>day(dpos),1,0/12)
& ' г ' &
datediff('m',dnac,dpos)-iif(day(dnac)>day(dpos),1,0 mod 12)
& ' мес ' &
datediff('d',
dateadd('m',
datediff('m',dnac,dpos)-iif(day(dnac)>day(dpos),1,0 mod 12)
,dateadd('yyyy',
int(datediff('m',dnac,dpos-iif(day(dnac)>day(dpos),1,0/12)
,dnac)
)
,dpos)
& ' дн'
) AS razn
FROM base;
При определении количества месяцев вычитаю 1, если день окончания меньше дня начала.
Отдельно выведено целое количество лет и месяцев.
Количество дней получается разницей между начальной датой + количество лет + количество месяцев.
Проверил с разными датами - работает.
Если не угадал с базой данных, пишите письма.

С уважением.
Ответ отправил: Филатов Евгений Геннадьевич (статус: 2-ой класс)
Ответ отправлен: 21.04.2006, 23:56
Оценка за ответ: 5
Комментарий оценки:
С базой Вы не угадали. У меня mysql. А вообще, хотелось обойтись стандартными sql-командами

Отвечает: Игорь Елизаров
Здравствуйте, Mikhail_m!

B SQL есть командочки Year , Month, Day которые позволяют выделить соответственно год, месяц и день из даты

например, отберем всех, кто родился в 2000 году
предполагаю, что данные лажат в таблице table

select datarojd from table
where year(datarojd) = 2000
order by datarojd

то есть отобрали даты рождения 200 года и отсортировали по дате
для года и месяца аналогично, например выберем февраль

select datarojd from table
where year(datarojd) = 2000 and month (datarojd) = 2
order by datarojd
вот вроде и все. сложностей быть не должно.

Ответ отправил: Игорь Елизаров (статус: 3-ий класс)
Ответ отправлен: 24.04.2006, 18:13
Оценка за ответ: 5
Комментарий оценки:
Поздновато, конечно, но лучше поздно, чем никогда. Все равно, спасибо.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.30 от 09.04.2006
Яндекс Rambler's Top100

В избранное