|
Вопрос # 5 630/ вопрос решён / |
|
Здравствуйте!
Вопрос по дате в запросах к MS Access. Вот код формирования запроса к БД:
SQL_GET_BLANKS_LIST='SELECT CTR.[Название страны],RMS.[Страна] as [Код страны], '+
'TBP.[Тип разрешения], RMS.[Тип разрешения] as [Код разрешения] '+
'FROM (([Остатки разрешений] RMS '+
'LEFT JOIN [Страны] CTR ON RMS.[Страна]=CTR.[Код Страны]) '+
'LEFT JOIN [Тип разрешений] TBP ON RMS.[Тип Разрешения]=TBP.[ID]) '+
'WHERE RMS.[Дата] BETWEEN :StartDT AND :EndDT '+
'UNION '+
'SELECT CTR.[Название страны],ARV.[Страна] as [Код страны], '+
'TBP.[Тип разрешения], ARV.[Тип разрешения] as [Код разрешения] '+
'FROM (([Приход разрешений] ARV '+
'LEFT JOIN [Страны] CTR ON ARV.[Страна]=CTR.[Код Страны]) '+
'LEFT JOIN [Тип разрешений] TBP ON ARV.[Тип Разрешения]=TBP.[ID]) '+
'WHERE ARV.[Дата] BETWEEN :StartDT AND :EndDT '+
'ORDER BY CTR.[Название страны], TBP.[Тип разрешения] ASC ';
LOADSQL.CommandText:=SQL_GET_BLANKS_LIST;
LOADSQL.Parameters.ParamByName('StartDT').DataType:=ftDateTime;
LOADSQL.Parameters.ParamByName('StartDT').Value:=DTMonthStart.Date;
LOADSQL.Parameters.ParamByName('EndDT').DataType:=ftDateTime;
LOADSQL.Parameters.ParamByName('EndDT').Value:=DTMonthEnd.Date;
LOADSQL.Open;
Дата имеет формат "dd.mm.yyyy HH:mm:ss", т.е. 24 часа, например: StartDT -->01.08.2011 00:00:01, EndDT -->31.08.2011 23:59:59, в таком случае запрос возвращает данные только из первого селекта, до UNION.
Убираю параметры, прописываю в запрсе жестко дату в формате #08/01/2011 00:00:01# - ругается на то что <<Неправильно определен объект Parameter, предоставлены неполные или несовместимые сведения.>> Если убрать время из условия отбора, т.е. написать дату в формате #08/01/2011# все работает, но мне надо с временем! В самом Access дата с временем отрабатывает без проблем. Вопрос: что я делаю НЕ так?
Использую Delphi 2007, TADODataSet, провайдер MS JET
 |
Вопрос задал: Sonic-X (статус: Посетитель)
Вопрос отправлен: 9 сентября 2011, 00:29
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: corban
Здравствуйте, Sonic-X!
ты ставишь параметр как дату в формате #08/01/2011 00:00:01#, а это есть стринг, а параметр у тебя в формате DataTime. Вот тебе и косяк
 |
Ответ отправил: corban (статус: 2-ой класс)
Время отправки: 9 сентября 2011, 02:42
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 12 сентября 2011, 19:24; участников в обсуждении: 3.
|
Егор (статус: 10-ый класс), 9 сентября 2011, 05:25 [#1]:
corban: неправильно. строка вводится в кавычках.
Sonic-X: а если дату вводить через точку?
#05.03.2011 2:00:00#
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
corban (статус: 2-ой класс), 9 сентября 2011, 06:03 [#2]:
Егор, хочешь сказать что такую фигню: #05.03.2011 2:00:00# компилятор дельфина переведет в нужный формат?
|
|
Sonic-X (статус: Посетитель), 9 сентября 2011, 08:03 [#3]:
ты ставишь параметр как дату в формате #08/01/2011 00:00:01#, а это есть стринг
А как ее кроме как стринг еще вставить в таком запросе:
'SELECT CTR.[Название страны],RMS.[Страна] as [Код страны], '+
'TBP.[Тип разрешения], RMS.[Тип разрешения] as [Код разрешения] '+
'FROM (([Остатки разрешений] RMS '+
'LEFT JOIN [Страны] CTR ON RMS.[Страна]=CTR.[Код Страны]) '+
'LEFT JOIN [Тип разрешений] TBP ON RMS.[Тип Разрешения]=TBP.[ID]) '+
'WHERE RMS.[Дата] BETWEEN #08/01/2011 00:00:01# AND #08/31/2011 23:23:59# '+
'UNION '+
'SELECT CTR.[Название страны],ARV.[Страна] as [Код страны], '+
'TBP.[Тип разрешения], ARV.[Тип разрешения] as [Код разрешения] '+
'FROM (([Приход разрешений] ARV '+
'LEFT JOIN [Страны] CTR ON ARV.[Страна]=CTR.[Код Страны]) '+
'LEFT JOIN [Тип разрешений] TBP ON ARV.[Тип Разрешения]=TBP.[ID]) '+
'WHERE ARV.[Дата] BETWEEN #08/01/2011 00:00:01# AND #08/31/2011 23:23:59# '+
'ORDER BY CTR.[Название страны], TBP.[Тип разрешения] ASC ';
Это когда я жестко прописываю дату в самом запросе. Если использую параметры как в первом посте, то запрос отрабатывает без ошибок, но "наполовину", до UNION, т.е. если убрать UNION и второй селект, запрос вернет теже данные, из этого я делаю вывод что UNION и нижний SELECT не отрабатывает.
Вводить через точку дату неполучится, Access будет ругаццо.
|
|
Егор (статус: 10-ый класс), 12 сентября 2011, 16:35 [#4]:
гм. вот ещё структуру базы данных увидеть бы
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 12 сентября 2011, 16:43 [#5]:
и ещё. а если только вторую часть запроса делать - возвратится хоть что-то? может, для второй части банально нет подходящих данных?
SELECT CTR.[Название страны],ARV.[Страна] AS [Код страны],
TBP.[Тип разрешения], ARV.[Тип разрешения] AS [Код разрешения]
FROM (([Приход разрешений] ARV
LEFT JOIN [Страны] CTR ON ARV.[Страна]=CTR.[Код Страны])
LEFT JOIN [Тип разрешений] TBP ON ARV.[Тип Разрешения]=TBP.[ID])
WHERE ARV.[Дата] BETWEEN :StartDT AND :EndDT
ORDER BY CTR.[Название страны], TBP.[Тип разрешения] ASC
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Sonic-X (статус: Посетитель), 12 сентября 2011, 18:14 [#6]:
и ещё. а если только вторую часть запроса делать - возвратится хоть что-то? может, для второй части банально нет
подходящих данных?
Данные есть:
1.Запрос корректно отрабатывает в MS Access.
2.Пробовал в только вторую часть запроса, данные есть.
Смысл такого запроса в том что надо выбирать именно из двух таблиц, например:
На начало месяца в остатке нет бланков, но был приход бланков в отчетном месяце, вот я этим запросом с UNION (UNION не выбирает повторяющиеся записи, UNION ALL - выбирает все записи) и получаю этот список.Таблиц 2 штуки - 1-я на приход бланков, 2-я на количество в остатке на 01 число каждого месяца.
P.S. Думал может это такие косяки потому что использую форму с отчетом в dll, скомпилил с рантайм пакетами, ниче не сменилось, куда рыть=((
|
|
Sonic-X (статус: Посетитель), 12 сентября 2011, 19:24 [#7]:
Все, разобрался в чем проблема! Оказывается нельзя чтоб в двух подзапросах название параметров имели одно имя!!!!
В первом запросе имя :StartDT и :EndDT
Во втором запросе поставил имя :StartDT2 и :EndDT2 и все заработало.
P.S. Чесно говоря непойму почему так, ведь даты что для первого селекта что и для второго совершенно одинаковые, а не робит такая конструкция...
Спасибо за помощь.
|
12 сентября 2011, 19:26: Статус вопроса изменён на решённый (изменил автор вопроса — Sonic-X)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|