Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
Здравствуйте.
Возникло странное несоответствие, помогите разобраться, пожалуйста.
SQL 2005

запрос:
SELECT sum(pole) FROM table
WHERE 
data>=CONVERT(datetime,CONVERT(varchar,getdate(),104),104)
AND 
data<CONVERT(datetime,'01.'+CAST(month(dateadd(mm,2,getdate())) as varchar)+'.'+cast(year(dateadd(mm,2,getdate())) as varchar),104)

если просто отобразить все записи с таким условием, то я получу диапазон дат от 16.06.2009 по 31.07.2009
однако сумму оно выдает на период с 17.06.2009 по 30.07.2009. Причем, вырезаются именно крайние даты: 16 и 31(вручную проверял,суммируя).

пробовал много вариантов с конвертами, но получается одно и то же.
В таблице даты занесены с нулевым временем.
16 июн 09, 09:24    [7303323]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Lunatikus,

1. Какого типа data?
2. Почему бы не написать короче:
SELECT SUM(pole)
FROM [table]
WHERE data>=CONVERT(char(8), GETDATE(),112) AND data<DATEADD(MONTH,2, CONVERT(char(6), GETDATE(),112)+'01')
Правда, это Ваш результат не исправит...
16 июн 09, 09:36    [7303361]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
data типа date
16 июн 09, 09:42    [7303381]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Lunatikus
data типа date
Значит, можно ещё короче
SELECT SUM(pole)
FROM [table]
WHERE data>=CAST(GETDATE() AS date) AND data<DATEADD(MONTH,2, CONVERT(char(6), GETDATE(),112)+'01')
Но это тоже не по существу...
16 июн 09, 09:55    [7303415]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Постойте! Как же так??
Lunatikus
Здравствуйте.
Возникло странное несоответствие, помогите разобраться, пожалуйста.
SQL 2005
Lunatikus
data типа date
Нет такого типа в SQL2005!
16 июн 09, 09:58    [7303429]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
простите,
datetime, конечно же
16 июн 09, 10:00    [7303440]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
Lunatikus,

SELECT data, sum(pole) FROM table
WHERE 
data>=CONVERT(datetime,CONVERT(varchar,getdate(),104),104)
AND 
data<CONVERT(datetime,'01.'+CAST(month(dateadd(mm,2,getdate())) as varchar)+'.'+cast(year(dateadd(mm,2,getdate())) as varchar),104)
group by data

а такой запрос выводит даты 16.06.2009 и 31.07.2009 ?
16 июн 09, 10:54    [7303675]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
Да, выводит. Чудес-то не бывает, блин...
16 июн 09, 12:15    [7304270]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
дорвался до базы и проверил код, предоставленный jap во втором посте.

как ни странно, но именно в таком конверте все суммируется верно: и 16.06 и 31.07 попадают.
Только все-таки не ясно, почему в случае с varchar суммирование происходит неверно,хотя интервал дат отображает верно.

спасибо большое, jap, вы решили мою проблему
16 июн 09, 12:21    [7304318]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Lunatikus
дорвался до базы и проверил код, предоставленный jap во втором посте.

как ни странно, но именно в таком конверте все суммируется верно: и 16.06 и 31.07 попадают.
Только все-таки не ясно, почему в случае с varchar суммирование происходит неверно,хотя интервал дат отображает верно.

спасибо большое, jap, вы решили мою проблему
А что там с varchar, не понял что-то?
16 июн 09, 12:24    [7304336]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
ну я использовал varchar вместо конкретного char(8).
Еще я использовал формат 104 вместо 112.

я сомневаюсь, что это все влияло, но других объяснений не вижу. Еще поэксперементирую
16 июн 09, 12:28    [7304364]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Lunatikus
ну я использовал varchar вместо конкретного char(8).
Еще я использовал формат 104 вместо 112.

я сомневаюсь, что это все влияло, но других объяснений не вижу. Еще поэксперементирую
VARCHAR в CAST и CONVERT - это VARCHAR(30)
Так что дело не в этом.
16 июн 09, 12:31    [7304375]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iljy
Guest
Lunatikus,

вообще использование преобразований дат в строки - плохая идея в общем случае. вам нужны сегодняшняя дата и дата "первое число черезследующего месяца"?
select 
dateadd(day, datediff(day, 0, getdate()), 0),
dateadd(month, datediff(month, 0, getdate()) + 2, 0)
16 июн 09, 13:15    [7304733]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
Lunatikus,

вообще использование преобразований дат в строки - плохая идея в общем случае.
Это почему же?
16 июн 09, 13:24    [7304808]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2iap
я тоже считаю использование этого - плохая идея, но чисто из соображений писания кода и понимания. для типов данных datetime есть функции предназначенные для работы с датой... и их хватает на любые необходимые преобразования дат...

для спящего время бодрствования равносильно сну
16 июн 09, 13:28    [7304845]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Алексей2003
я тоже считаю использование этого - плохая идея
Если такие вопросы решаются голосованием, то дальнейшие споры бессмысленны - вас уже двое на одного!
Демократия, понимаешь! ©
Вспомнилось
16 июн 09, 13:46    [7304968]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iljy
Guest
iap,

я имею ввиду для выполнения вычислений над датами:) не в последнюю очередь из-за потерь производительности.
select top 10000000
   dateadd(day, datediff(day, 0, date), 0),
   dateadd(month, datediff(month, 0, date) + 2, 0)
from data

select top 10000000
    CONVERT(datetime,CONVERT(varchar,date,104),104),
    CONVERT(datetime,'01.'+CAST(month(dateadd(mm,2,date)) as varchar)+'.'+
				cast(year(dateadd(mm,2,date)) as varchar),104)
from data

эти два запроса по потреблению процессорного времени различаются в 4 раза.
16 июн 09, 14:19    [7305222]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
попробовал через
dateadd(month, datediff(month, 0, getdate()) + 2+:srok1, 0)+:srok2

выдает ошибку
"argument data type datetime is invalid for argument 2 af dateadd function"
разве в функции dateadd нельзя использовать параметры?

srok1 и srok2 - параметры типа int
16 июн 09, 14:42    [7305374]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2iljy
до 10млн записей не доходило.. сравнивал 1млн помню... вышло баш на баш..

для спящего время бодрствования равносильно сну
16 июн 09, 14:44    [7305382]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
у SQL Server параметры объявляются через @.

для спящего время бодрствования равносильно сну
16 июн 09, 14:45    [7305385]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iljy
Guest
Алексей2003,

запустил на другой таблице, для миллиона с хвостом - получилось 594 ms и 2422 ms, т.е. относительная разница даже больше (для 10млн было примерно 6000 и 21500). я имею ввиду не время выполнение запроса, оно не сильно отличается - сканирование больше занимает, а именно потребление времени процессора.
16 июн 09, 14:52    [7305438]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2iljy
каюсь, CPU не сравнивал. чтож, убедился теперь, что пользоваться нужно теми инструментами, которые специально были придуманы, а не изгаляться через преобразования типов...

для спящего время бодрствования равносильно сну
16 июн 09, 15:08    [7305536]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
автор
у SQL Server параметры объявляются через

а я надеялся, что не придется идти в раздел delphi+SQL...видимо, проблема именно на этапе передачи параметров средствами дельфи в запрос(в тексте запроса используется двоеточие, а сами значения присваиваются программно через свойства запроса).
ладно

спасибо вам большое за помощь.
16 июн 09, 15:58    [7305846]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с условием на даты в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Lunatikus
автор
у SQL Server параметры объявляются через

а я надеялся, что не придется идти в раздел delphi+SQL...видимо, проблема именно на этапе передачи параметров средствами дельфи в запрос(в тексте запроса используется двоеточие, а сами значения присваиваются программно через свойства запроса).
ладно

спасибо вам большое за помощь.
В тексте парметрического запроса в Delphi надо ставить двоеточие.
Но ADO или BDE при обращении к серверу заменят параметры на значения как надо уже без Вашего участия.
Так что беспокоиться не о чем.
Но зачем запрос, написанный для компонентов ADO, BDE и т.п. посылать непосредственно на сервер?
Если Вам так хочется, то пожалуйста, но сначала работу драйверов Delphi по замене параметров значениями придётся сделать самому
16 июн 09, 16:04    [7305887]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить