Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];

Вниз

Помогите с запросом - как посторить?..   Найти похожие ветки 

 
Владий   (2003-09-03 15:27) [0]

Нужно отбирать дни рождения, рассчитывать количество полных лет, но я слабо продставляю - как это сделать...
Мыслилось, что так:

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-03 17:22) [1]

плюс минус четыре месяца, итого восемь. (??) чего уж там, добавь по паре с каждой стороны и выкидывай условие нафиг. ;о))

обьясни на словах чего хочеш, и какие данные где, и что не то.

и чем отличаются жирные года от полных лет? ;о)))


 
Владий   (2003-09-03 17:27) [2]

Словами все проще, нежели в действительности - есть таблица, гда одно из полей -День рождения (дд.мм.гггг). Нужно сделать выборку - +/- 4 дня от текущей даты + расчет соклько же лет исполнится человеку... Т.е. как я понимаю - вначале выборка по дате (исключая значение года), затем - расчет округленного значения разницы лет между текущим годом и годом рожения человека...


 
sniknik   (2003-09-03 17:41) [3]

условие
WHERE Int(BD-Year(BD)) BETWEEN Int(Now()-Year(Now()))-4 AND Int(Now()-Year(Now()))+4

(int у поля на случай если и минуты рождения занесены)
количество лет проще просто Year(Now())-Year(BD)


 
Владий   (2003-09-03 18:03) [4]

Не работает... Выдает пустую выборку...
Посмотрел. Понял, что обхеденил в описании 2 задачи...

1. Сделать выборку по Дате и Месяцу (без учета Года).
В отдельности по дате, в отдельности по году - получается, вместе - нет...
2. Рассчитать разницу лет - тут, вроде, понятно как считать...


 
Sandman25   (2003-09-03 18:25) [5]

ИМХО, надо все перевести в количество дней от начала года и только потом сравнивать. Иначе, боюсь, не получится - слишком сложно обрабатывать переходы между месяцами.


 
sniknik   (2003-09-03 18:26) [6]

нда, видать високосные года в расчеты вмешиваются (хотел предупредить что не учел ... но :()
тогда попробуй так
WHERE DateSerial(0, Month(DB), Day(DB)) BETWEEN DateSerial(0, Month(Now()), Day(Now()))-4 AND DateSerial(0, Month(Now()), Day(Now()))+4


 
Владий   (2003-09-03 18:38) [7]

"Несоотетствие типов даных в выражении условия отбора"...

SELECT People.BD, People.Family, People.Name, People.Otch, People.Department
FROM People
WHERE DateSerial(0, Month(BD), Day(BD)) BETWEEN DateSerial(0, Month(Now()), Day(Now()))-4 AND DateSerial(0, Month(Now()), Day(Now()))+4
ORDER BY People.BD;


 
sniknik   (2003-09-03 23:42) [8]

ааа! .... BDE, или аксесс старый?(скобочка в конце запроса и идиотская вставка имени таблици в однозначном запросе из 1 таблици, явно из визарда) предупреждать надо. переходи на ADO, обнови Access(Jet), если последнее средство не поможет (подогнать типы) так
SELECT BD, Family, Name, Otch, Department FROM People
WHERE 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

но вобще, проверил, и без подгонки работает.


 
Владий   (2003-09-04 09:02) [9]

Даже не знаю что сказать... Access 2002, из программы работаю через АДО....
А

SELECT BD, Family, Name, Otch, Department FROM People
WHERE 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;

вызывает ругань на ошибку синтаксиса...


 
Владий   (2003-09-04 10:22) [10]

Блин... все решилось гораздо проще....


SELECT Year(Now())-Year([bd]) AS CountYears, *
FROM People
WHERE (((Day(Now())-Day([BD]))<=4 And (Day(Now())-Day([BD]))>=0) AND ((Month(Now()))=Month([bd])))
ORDER BY People.BD;


 
sniknik   (2003-09-04 10:23) [11]

не может быть, покажи как вызываеш. (тока не примерно, а копированием из программы где ошибка синтаксиса)


 
sniknik   (2003-09-04 10:25) [12]

Владий © (04.09.03 10:22) [10]
не учтено перехода между месяцами.

(у меня только переход года пропустит)


 
Sandman25   (2003-09-04 11:30) [13]

[9] Владий © (04.09.03 09:02)

Там у Вас скобка лишняя в
CDate ((DateSerial(0, Month(Now()), Day(Now()))-4)


 
Sandman25   (2003-09-04 11:32) [14]

Скобка сразу после CDate - я ее жирной написал, но почти не видно, поэтому словами объясняю.


 
Владий   (2003-09-04 14:26) [15]

Если вернуться к мысли:

SELECT Year(Now())-Year([bd]) AS CountYears, *
FROM People
WHERE 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;


Убрав лишнююю скобку получаю сообщение:

"Несоответствие типов данных в выражении условия отбора"


 
Sandman25   (2003-09-04 15:19) [16]

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;


 
Sandman25   (2003-09-04 15:21) [17]

Кстати, ни что такое CDate, ни что такое DateSerial, я не знаю. Просто пытаюсь исправить ошибки логически, судя по диагностич. сообщениям :)


 
sniknik   (2003-09-04 15:27) [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


 
sniknik   (2003-09-04 15:31) [19]

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


 
Sandman25   (2003-09-04 15:36) [20]

[19] sniknik © (04.09.03 15:31)

Спасибо.


 
Sandman25   (2003-09-04 15:37) [21]

>ну и еше попробовать 4 -ку на CDate(4) заменить, что будет?

Не, из даты вычитать дату нельзя. Только integer.


 
sniknik   (2003-09-04 15:38) [22]

еще вариант
WHERE
ABS(DateDiff("d", DateSerial(0, Month(Now()), Day(Now())), DateSerial(0, Month(BD), Day(BD)))) < 4
ORDER BY BD


 
sniknik   (2003-09-04 15:39) [23]

Sandman25 © (04.09.03 15:37) [21]
> Не, из даты вычитать дату нельзя. Только integer.

не удивляйся, но можно. и результат не меняется.


 
Sandman25   (2003-09-04 15:44) [24]

[23] sniknik © (04.09.03 15:39)

Торможу.
Сам много раз так делал :)


 
roottim   (2003-09-04 16:19) [25]

>Нужно отбирать дни рождения, рассчитывать количество полных лет
я не особо знаток аккцеса, но полных лет это не стаж считать ведь...
цыфра 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


 
Владий   (2003-09-05 09:17) [26]

Проблема в том, что у меня Jet 3.x... И все предложенные варианты - не работают, ругаясь не несовместимость типов данных...


 
sniknik   (2003-09-05 10:58) [27]

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...

?????????????????????? где правда? и разве это проблема когда уже ясна причина? чего стоит обновить?


 
Reindeer Moss Eater   (2003-09-05 11:10) [28]

Для 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() на функцию текущей даты.
Учитываются дни рождения приходящиеся на следующий месяц и следующий год


 
Владий   (2003-09-05 18:43) [29]

Не учитывается ничего...


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 19:49) [30]

не показыват ничего ни вчера, ни сегодня, ни завтра...
Нет записей, удовлетворяющих условию. Вот и не показывает ничего.


 
sniknik   (2003-09-05 22:01) [31]

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
хотя и не похоже


 
Владий   (2003-09-08 09:30) [32]

2 Reindeer Moss Eater: записи есть, но не находятся...

2 sniknik: тоже не работает.. "Несоответствие типов данных в выражении условия отбора"

И Jet не обновить - у меня w2kSP4, а обновление есть только для SP3... =(


 
sniknik   (2003-09-08 11:51) [33]

а вот это интересно
> И Jet не обновить - у меня w2kSP4, а обновление есть только для SP3... =(
как ты умудрился на 2000й Jet 3.x поставить? там с первого без SP-ков идет 4й jet/mdac 2.5.

чем дальше тем больше убеждаюсь что глюк в 17 строке, а не в запросе при совместимости с jet. (за все время ничего конкретного, вроде кода, даже строка не приведена, и т.д.) только разные нестыкующиеся между собой сведения (сознательный обман? кому ответ нужен?).
ты даже не сказал какого типа у тебя поле DB. (подразумевается что дататайм, операции то с датами. уверен все так и поняли) но вдруг нет? вот тебе и "Несоответствие типов данных".


 
Владий   (2003-09-08 14:38) [34]

Скажем, ставил не я, а админы... и в Системной информации в строке jet 4.x - "нет данных"...

Поле BD - дататайм/краткий формат даты.

Запрос сейчас проверяю прямо в эксесе...


 
sniknik   (2003-09-08 15:28) [35]

> Поле BD - дататайм/краткий формат даты.
в Access ?? нет такого типа! краткого формата нет, как и времени! есть только DATETIME. (в синонимах есть DATE, TIME но оба типа DATETIME)

(диагноз, сознательный ввод в заблуждение :-))

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

SELECT *
FROM People
WHERE DateSerial(Year(Date()), Month(Now()), Day(Now())) BETWEEN Date()-4 AND Date()+4
(вернет все записи)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.011 c
14-96380
Digitman
2003-09-05 10:44
2003.09.29
OFF: Тяпница ж сегодня) ...


9-96046
Project-Soft
2003-03-22 10:12
2003.09.29
Особые столкновения спрайтов в DelphiX !


14-96427
Dimich1978
2003-09-10 09:50
2003.09.29
Ну блин Церковь во дает!!!


3-96103
Burn
2003-09-09 00:56
2003.09.29
Локальные БД


3-96053
Mexikan
2003-09-09 20:17
2003.09.29
Как прервать выполнение запроса fibplus





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский