![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с запросом - как посторить?.. [D6, Access]
Владий © (2003-09-03 15:27:00)
Нужно отбирать дни рождения, рассчитывать количество полных лет, но я слабо продставляю - как это сделать...
Мыслилось, что так:
SELECT People.BD, People.Family, People.Name, People.Otch, People.Department
FROM People
WHERE (((People.BD) Between Month(Now())-4 And Month(Now())+4))
ORDER BY People.BD;
Ан нет -что-то не то...
sniknik (2003-09-08 15:28:00) [1]
> Поле BD - дататайм/краткий формат даты.
в Access ?? нет такого типа! краткого формата нет, как и времени! есть только DATETIME. (в синонимах есть DATE, TIME но оба типа DATETIME)
(диагноз, сознательный ввод в заблуждение :-))
попробуй такой запрос (в нем никакого смысла, но должен сработать) и если сработает то однозначно тип поля.
SELECT *
FROM People
WHERE DateSerial(Year(Date()), Month(Now()), Day(Now())) BETWEEN Date()-4 AND Date()+4
(вернет всезаписи)
Владий (2003-09-08 14:38:00) [2]
Скажем, ставил не я, а админы... и в Системной информации в строке jet 4.x - "нет данных"...
Поле BD - дататайм/краткий формат даты.
Запрос сейчас проверяю прямо в эксесе...
sniknik (2003-09-08 11:51:00) [3]
а вот это интересно
> И Jet не обновить - у меня w2kSP4, а обновление есть только для SP3... =(
как ты умудрился на 2000й Jet 3.x поставить? там с первого без SP-ков идет 4й jet/mdac 2.5.
чем дальше тем больше убеждаюсь что глюк в 17 строке, а не в запросе при совместимости с jet. (за все время ничего конкретного, вроде кода, даже строка не приведена, и т.д.) только разные нестыкующиеся между собой сведения (сознательный обман? кому ответ нужен?).
ты даже не сказал какого типа у тебя поле DB. (подразумевается что дататайм, операции то с датами. уверен все так и поняли) но вдруг нет? вот тебе и "Несоответствие типов данных".
Владий (2003-09-08 09:30:00) [4]
2 Reindeer Moss Eater: записи есть, но не находятся...
2 sniknik: тоже не работает.. "Несоответствие типов данных в выражении условия отбора"
И Jet не обновить - у меня w2kSP4, а обновление есть только для SP3... =(
sniknik (2003-09-05 22:01:00) [5]
Reindeer Moss Eater © (05.09.03 11:10) [28]
кстати вдохновил меня на еще один вариант, для Access учитывает все (работать под jet 3.x скорее всего тоже не будет :о)
SELECT *
FROM People
WHERE DateSerial(Year(Date()), Month(DB), Day(DB)) BETWEEN Date()-4 AND Date()+4
хотя и не похоже
Reindeer Moss Eater (2003-09-05 19:49:00) [6]
не показыват ничего ни вчера, ни сегодня, ни завтра...
Нет записей, удовлетворяющих условию. Вот и не показывает ничего.
Владий (2003-09-05 18:43:00) [7]
Не учитывается ничего...
SELECT Year(Now())-Year([BD]) AS CountYears, *
FROM People
WHERE (Month(BD) = Month(Now()) And Day(BD) - Day(Now()) Between 0 and 3)
OR
(
Month(BD) = Month(Now() + 3) And Day(BD) <=Day(Now()+3) And Month(Now()+3) <> Month(Now())
)
ORDER BY BD;
не показыват ничего ни вчера, ни сегодня, ни завтра...
Думать в тяпницу вечером тяжко и не получается, поэтому идея оставленна до понедельника...
PS. Всем большой спасибо =)))
Reindeer Moss Eater (2003-09-05 11:10:00) [8]
Для MSSQL:
все дни рождения сеогдя + ближайшие три дня
Select * From Peoples
Where
(Month(BDate) = Month(GetDate()) And Day(BDate) - Day(GetDate()) Between 0 and 3)
OR
(
Month(BDate) = Month(GetDate() + 3) And Day(BDate) <=Day(GetDate()+3) And Month(GetDate()+3) <> Month(GetDate())
)
Для ACCECC заменить GetDate() на функцию текущей даты.
Учитываются дни рождения приходящиеся на следующий месяц и следующий год
sniknik (2003-09-05 10:58:00) [9]
sniknik © (03.09.03 23:42) [8]
> ааа! .... BDE, или аксесс старый? ...
Владий © (04.09.03 09:02) [9]
> Даже не знаю что сказать... Access 2002, из программы работаю через АДО....
Владий © (05.09.03 09:17) [26]
Проблема в том, что у меня Jet 3.x...
?????????????????????? где правда? и разве это проблема когда уже ясна причина? чего стоит обновить?
Владий (2003-09-05 09:17:00) [10]
Проблема в том, что у меня Jet 3.x... И все предложенные варианты - не работают, ругаясь не несовместимость типов данных...
roottim (2003-09-04 16:19:00) [11]
>Нужно отбирать дни рождения, рассчитывать количество полных лет
я не особо знаток аккцеса, но полных лет это не стаж считать ведь...
цыфра 40 это число явно > количества дней в мес... можно и 32 и 33...
проверте акцесовцы...!
SELECT
IIf(
(DAY(AGE) + MONTH(AGE)*40) > (DAY(NOW()) + MONTH(NOW())*40),
YEAR(NOW())-YEAR(AGE)-1,
YEAR(NOW())-YEAR(AGE)
) AS D1
FROM T1
Sandman25 (2003-09-04 15:44:00) [12]
[23] sniknik © (04.09.03 15:39)
Торможу.
Сам много раз так делал :)
sniknik (2003-09-04 15:39:00) [13]
Sandman25 © (04.09.03 15:37) [21]
> Не, из даты вычитать дату нельзя. Только integer.
не удивляйся, но можно. и результат не меняется.
sniknik (2003-09-04 15:38:00) [14]
еще вариант
WHERE
ABS(DateDiff("d", DateSerial(0, Month(Now()), Day(Now())), DateSerial(0, Month(BD), Day(BD)))) < 4
ORDER BY BD
Sandman25 (2003-09-04 15:37:00) [15]
>ну и еше попробовать 4 -ку на CDate(4) заменить, что будет?
Не, из даты вычитать дату нельзя. Только integer.
Sandman25 (2003-09-04 15:36:00) [16]
[19] sniknik © (04.09.03 15:31)
Спасибо.
sniknik (2003-09-04 15:31:00) [17]
Sandman25 © (04.09.03 15:21) [17]
> Кстати, ни что такое CDate, ни что такое DateSerial, я не знаю.
CDate Function
Return Type - Date
expression argument - Any valid date expression.
DateSerial Function
Return Type - Date
expression arguments year, month, day - Any numeric expression
sniknik (2003-09-04 15:27:00) [18]
ты так и не показал как запрос выполняеш (не чистый запрос а кусок программы с вызовом)
может он у тебя на 4-ку ругается не может совместить (хотя это странно, и единственное обьяснение что у тебя Jet старый), потому как у меня работает. могу только свою прогу тебе выслать для проверки
ну и еше попробовать 4 -ку на CDate(4) заменить, что будет?
вот так
SELECT Year(Now())-Year([BD]) AS CountYears, *
FROM People
WHERE DateSerial(0, Month(BD), Day(BD))
BETWEEN
DateSerial(0, Month(Now()), Day(Now()))-CDate(4)
AND
DateSerial(0, Month(Now()), Day(Now()))+CDate(4)
ORDER BY BD
Sandman25 (2003-09-04 15:21:00) [19]
Кстати, ни что такое CDate, ни что такое DateSerial, я не знаю. Просто пытаюсь исправить ошибки логически, судя по диагностич. сообщениям :)
Sandman25 (2003-09-04 15:19:00) [20]
SELECT Year(Now())-Year([bd]) AS CountYears, *
FROM People
WHERE CDate(DateSerial(0, Month(BD), Day(BD)) )
BETWEEN
CDate(DateSerial(0, Month(Now()), Day(Now()))-4)
AND
CDate(DateSerial(0, Month(Now()), Day(Now()))+4)
ORDER BY BD;