powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение дат
9 сообщений из 9, страница 1 из 1
Сравнение дат
    #32073888
wer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема такая:Формируем первую и последнюю дату месяца и сравниваем ее с полем типа дата с помощью between Последняя дата месяца не обрабатывается! Заменили на <= то же самое! Почему и как жить дальше?
...
Рейтинг: 0 / 0
Сравнение дат
    #32073897
Kr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kr
Гость
Судя по всему ваши данные содержат кроме даты ещё и время, а вы формируете последнюю дату месяца как "дата:0часов:0минут..." поэтому запрос на < или <= такой дате не обрабатывается.
Посоветовать в данном случае можно или правильно формировать последнюю дату месяца, или брать значение меньшее первой даты следующего месяца 0 часов 0 минут. Вот, примерно так видятся перспективы Вашей дальнейшей жизни :)
...
Рейтинг: 0 / 0
Сравнение дат
    #32073921
wer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, перспективы у нас отвратительные, потомучто время стоит 12:00 AM.
...
Рейтинг: 0 / 0
Сравнение дат
    #32073931
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы обычно делаем так:

Код: plaintext
1.
2.
3.
4.
5.
 @d - последняя дата без времени
set @d = dateadd(day, 1 ,@d)
select *
from .....
where .... and Date < @d


Тогда все точно выберется
...
Рейтинг: 0 / 0
Сравнение дат
    #32073936
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно использовать функцию
DATEDIFF()
...
Рейтинг: 0 / 0
Сравнение дат
    #32073986
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С функцией индексы не будут работать
...
Рейтинг: 0 / 0
Сравнение дат
    #32074054
fil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fil
Гость
обычно делаю так
Код: plaintext
1.
2.
3.
4.
declare @d varchar( 8 )
set @d='20021130'
select * from .....
          where convert(varchar( 8 ),Date, 112 ) <=@d
...
Рейтинг: 0 / 0
Сравнение дат
    #32074060
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 tygra
не понял, что означает - с функцией индексы не сработают ?
...
Рейтинг: 0 / 0
Сравнение дат
    #32074465
tygra прав когда берется функция от поля имеющего индекс этот индекс использоваться не будет.

2 tygra у вас индекс также не будет работать если ваш вариант выполняется одним батчем. Здесь на форуме был топик в котором это было описано. Я сперва не поверил, когда проверил волосы дыбом встали. Топика не нашел вот то что писал vics
Avoid using variables in the WHERE clause of a query located in a batch file. Let's find out why this may not be a good idea.

First, let's look at the following code:

SELECT employee_id
FROM employees
WHERE age = 30 and service_years = 10

Assuming that both the age and the service_years columns have indexes, and the table has many thousands of records, then SQL Server's Query Optimizer will select the indexes to perform the query and return results very quickly.

Now, let's look at the same query, but written to be more generic, one that you might find in a generic batch file:

DECLARE @age int
SET @age = "30"
DECLARE @service_years int
SET @service_years = "10"
SELECT employee_id
FROM employees
WHERE age = @age and service_years = @service_years

When the above code is run, even though both the age and the service_years columns have indexes, they may not be used, and a table scan may be used instead, potentially greatly increasing the amount of time for the query to run.

The reason the indexes may not be used is because the Query Analyzer does not know the value of the variables when it selects an access method to perform the query. Because this is a batch file, only one pass is made of the Transact-SQL code, preventing the Query Optimizer from knowing what it needs to know in order to select an access method that uses the indexes.

If you cannot avoid using variables in the WHERE clauses of batch scripts, consider using an INDEX query hint to tell the Query Optimizer to use the available indexes instead of ignoring them and performing a table scan. This of course that the indexes are highly selective. If the indexes are not highly selective, then a table scan most likely be more efficient than using the available indexes.

Another option is to not use a script, but a stored procedure instead. Variables in stored procedures don't cause the problem described above.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение дат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]