Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с запросом - как посторить?.. [D6, Access]


Страницы:   1 2

Владий ©   (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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо