Вопрос № 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 Комментарий оценки: Поздновато, конечно, но лучше поздно, чем никогда. Все равно, спасибо.