![]() |
|
#1
|
||||
|
||||
![]() Народ, подскажите пожалуйста, как произвести поиск в интервале дат через sql
Код:
clm.Close; clm.SQL.Clear; clm.SQL.Text:='select *'+ ' from my_live_rol'+ ' where (date_b=)and(date_e is null)'; Подскажите please |
#2
|
|||
|
|||
![]() ...WHERE date_b BETWEEN CONVERT(DATETIME, '11.03.2007', 104) AND сегодняшнее число спрашивать у базы данных (GETDATE()) или у Delphi (Today)?
104 означает формат dd.mm.yy (German). Если без функции Convert послать дату, то у БД может оказаться, напр., американский формат mm/dd/yy, т.е. месяцы и дни переставлены, и будет ошибка. Если границы дат не надо включать, то к минимальной границе надо прибавить один день, а от максимальной отнять (либо вместо Between использовать неравенства <, >) |
#3
|
||||
|
||||
![]() Спасибо, большое : )
Подскажи мне пожалуста ещё ответ на один вопросик Если дата должна быть в интервале от dt и dt0 типа string, хранящие даты. Или как мне ещё сделать? С таблицы и формы беру по дате и в 3ьей хочу найти запись в интревале этих дат. Код:
dt:=datetostr(teku.FieldByName('NACH_CONP').AsDateTime); dt0:=datetostr(form1.DateTimePicker2.date); ![]() |
#4
|
|||
|
|||
![]() Цитата:
Цитата:
Постарайся успокоиться, не нервничай, никто тебя не укусит. Ещё раз опиши задание (вопрос) |
#5
|
||||
|
||||
![]() В общем, с таблицы я беру значение dt, а с формы получаю значение dt0, хочу организовать поиск в таблице my_live_rol по записям, у которых поле date_b находится в интнрвале от dt по dt0
|
#6
|
|||
|
|||
![]() Код:
var dt: TDateField; sdt, sdt0: String; Код:
dt.DisplayFormat:= 'dd.mm.yyyy'; Код:
sdt:= dt.AsString; ... sdt0:= FormatDateTime('dd.mm.yyyy', DateTimePicker2.Date); Код:
...WHERE date_b BETWEEN CONVERT(DATETIME, sdt, 104) AND CONVERT(DATETIME, sdt0, 104) Последний раз редактировалось AlexSku, 30.05.2007 в 11:33. |
#7
|
||||
|
||||
![]() Большое спасибо
![]() |
#8
|
|||
|
|||
![]() Извини, похоже, рано я тебя обнадёжил - забыл про апострофы (а как же можно сосредоточиться, глядя на такое фото?) и в результате строковые переменные попали вовнутрь константы. Надо было так:
Код:
clm.SQL.Text:='select *'+ ' from my_live_rol'+ ' where date_b between CONVERT(DATETIME, ' + sdt + ', 104) and CONVERT(DATETIME, ' + sdt0 + ', 104)' Код:
select * from my_live_rol where date_b between CONVERT(DATETIME, :psdt, 104) and CONVERT(DATETIME, :psdt0, 104) DataType = ftString , ParamType = ptInput. После открытия БД можно послать предварительную подготовку: Код:
Query1.Prepare; Код:
with Query1 do begin Close; Params.ParamValues['psdt']:= sdt; Params.ParamValues['psdt0']:= sdt0; ExecSQL; end; |
#9
|
||||
|
||||
![]() Спасибо за дополнение
![]() Мне тоже нравиться что то на первый взгяд муторное, но интересное, просто иногда нет возможности по времени сидеть разбираться ![]() |
#10
|
||||
|
||||
![]() неохота тебя расстраивать, но я или что то делаю не так, или не поняла.
Код:
live.Close; live.SQL.Clear; live.SQL.Text:='select l.rowid,l.ROL_PASP_ID,l.DATE_B,l.DATE_E,l.MNLZ,l.RU,l.RAD_ID,l.PRICH,l.COL_PL'+ ' from my_live_rol l'+ ' where (l.ROL_PASP_ID='+floattostr(rolk[i])+')and(l.DATE_E is null)and(l.DATE_B between convert(datetime,'+dt+',104) and convert(datetime,'+dt0+',104))'; live.Open; при live.open получаю ошибку 'missing right parenthesis' ![]() |
#11
|
|||
|
|||
![]() Ошибка чисто стилистическая - не хватает одной закрывающей скобки в конце (т.е. перед последним апострофом не 2, а 3 скобки. Часто помогает такой приём: скобки всегда вводить парой, а затем вписывать текст вовнутрь). Но после этого возможен другой подводный камень: в моём тексте я ввёл строковые представления для переменных (sdt и sdt0), а у тебя старый вариант - dt и dt0. Если это переменные не типа string, то будет ошибка.
|
#12
|
||||
|
||||
![]() Я всегда стараюсь вводить скобки парой, я перепроверяла, вроде все на месте. Добавила перед последним апострофом, та же ситуация(с ошибкой). Может я как то неправильно условия в скобки заключила?
dt,dt0 строкового типа, я немножко пределала поэтому они не sdt,sdt0 ![]() Ошибка всё та же ![]() |
#13
|
|||
|
|||
![]() Извини, беру свои слова обратно. Я сам неправильно просчитал скобки. Но т.к. ошибка, что не хватает правой (т.е. закрывающей) скобки, то на всякий случай выведи значения dt и dt0 (напр., ShowMessage(dt); ShowMessage(dt0), может быть в них появились скобки?
|
#14
|
||||
|
||||
![]() Ты имеешь в виду в значениях dt и dt0? Я проыверяла, вроде всё в порядке. При пошаговой запрос выглядит так
Код:
..where (l.ROL_PASP_ID=16331)and(l.DATE_B between convert(datetime,11.03.2007,104) and convert(datetime,25.05.2007,104))and (l.DATE_E is null)' |
#15
|
||||
|
||||
![]() А если так попробовать:
Код:
..where (l.ROL_PASP_ID=16331) and (l.DATE_B between convert(datetime,'11.03.2007',104) and convert(datetime,'25.05.2007',104)) and (l.DATE_E is null) в догонку: как-то не логично выбирать в запросе поле указав в условие его равнство null'у (DATE_E) |