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

Откуда: Киев
Сообщений: 27
Помогите советом.
Задача следующая:
Мне нужно найти в таблице значения по условию, вхождения даты в диапазоне других двух дат.Все даты в базе с временем.
Когда время во всех датах 00 00 00, то результат выводится. Но если даты различны, то данных нет , при запросе. По пытался обойти через преобразование даты, результат -0. Ниже часть запроса, где сравниваются даты :
t1.days BETWEEN CONVERT (DATETIME,task.start_date,104) AND CONVERT (DATETIME,task.complete_date,104)
4 авг 11, 18:56    [11073022]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Raoul
Member

Откуда:
Сообщений: 177
Версия сервера какая?
4 авг 11, 18:57    [11073027]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Hamster_Rulik
Member

Откуда: Киев
Сообщений: 27
2005
4 авг 11, 18:59    [11073035]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Hamster_Rulik, либо приводите к типу date, если версия сервера позволяет, либо вместо days BETWEEN start_date AND complete_date используйте days >= start_date AND days < DATEADD(dd, 1, complete_date )
4 авг 11, 18:59    [11073036]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/faq/faq_topic.aspx?fid=110
5 авг 11, 06:13    [11074088]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Hamster_Rulik
Member

Откуда: Киев
Сообщений: 27
используйте days >= start_date AND days < DATEADD(dd, 1, complete_date ) 

Исключил время вашим способом...но у меня выпадает из сравнения 1 день недели, и данные сдигаются на день в перед (выходные, я отсекаю).

Ниже сам запрос, который по заданным датам группирует шапку по пользователям, и добавляет количества записей, по данному сотруднику и периоду, в таблице task:
 SELECT t1.region,
            t1.obl,
            t1.dolgn,
            t1.sotr,
            t1.employee_id,
            t1.work_date,
            t1.days,
            'zadach' AS report,
            count (task.id)
       FROM (SELECT DISTINCT st.region,
                             st.obl,
                             st.dolgn,
                             st.sotr,
                             st.employee_id,
                             st.work_date,
                             appointment.date AS days
               FROM (SELECT employee_department.name AS region,
                            oblast.name AS obl,
                            employee_doljnost.name AS dolgn,
                            employee.last_name + ',' + employee.first_name AS sotr,
                            employee.id AS employee_id,
                            employee.activation_date AS work_date
                       FROM employee,
                            employee_department,
                            oblast,
                            employee_doljnost,
                            town
                      WHERE employee.status_id = 1
                            AND employee.employee_doljnost_id =
                                  employee_doljnost.ID
                            AND employee.town_id = town.id
                            AND town.oblast_id = oblast.id
                            AND employee_department.id =
                                  employee.employee_department_id) AS st,
                    appointment
              WHERE appointment.date BETWEEN CONVERT (DATETIME, '01.07.2011', 104)
                                         AND  CONVERT (DATETIME,
                                                       '08.08.2011',
                                                       104)
                    AND appointment.date NOT IN
                             (SELECT date FROM holiday_classifier)) AS t1
            JOIN task
            ON     task.employee_id = t1.employee_id
               AND t1.days >= task.start_date
               AND t1.days < dateadd (dd, 1, task.complete_date)
               AND task.task_group_id <> 8
   GROUP BY t1.region,
            t1.obl,
            t1.dolgn,
            t1.sotr,
            t1.employee_id,
            t1.work_date,
            t1.days
Буду благодарен за помощь
5 авг 11, 12:06    [11075513]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Hamster_Rulik
Исключил время вашим способом...но у меня выпадает
Судя по предыдущим сообщениям, start_date и complete_date сами содержат ненулевое время, а Вас интересуют именно сутки.
Ясно, что сначала надо навести порядок в этом бардаке и сохранять эти поля сразу с нулевым временем.

Если это невозможно, то придётся делать вычисляемые поля, например, которые и использовать
в условиях, ограничивающих дату из другой таблицы. По крайней мере, эти вычисляемые поля можно и проиндексировать
(в отличие от выражения, обнуляющего время).
5 авг 11, 12:15    [11075611]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Уленшпигель
Member

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

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

CAST(CAST(mydate as int) as datetime)

mydate - собственно дата с временем
5 авг 11, 12:19    [11075641]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Уленшпигель
Hamster_Rulik,

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

CAST(CAST(mydate as int) as datetime)

mydate - собственно дата с временем
DATEADD(DAY, DATEDIFF(0,dt),0)
CONVERT(CHAR(8),dt,112)
Но индексы, коллега, индексы!!
5 авг 11, 12:42    [11075835]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
iap
Но индексы, коллега, индексы!!


вы правы, конечно. но чтобы применить индексы (к вычисляемому полю или к полю, куда заносится только дата), надо сначала избавиться от времени в уже существующих данных :)
5 авг 11, 12:46    [11075876]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Уленшпигель
iap
Но индексы, коллега, индексы!!


вы правы, конечно. но чтобы применить индексы (к вычисляемому полю или к полю, куда заносится только дата), надо сначала избавиться от времени в уже существующих данных :)
В отношении вычисляемого поля это не так.
5 авг 11, 12:49    [11075897]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Уленшпигель
Member

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

но оно же должно как-то вычисляться :) я привел один из способов вычисления - и только.
5 авг 11, 12:55    [11075947]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Уленшпигель
iap,

но оно же должно как-то вычисляться :) я привел один из способов вычисления - и только.
Если PERSISTED, то только при вставке/изменении, а не во время запроса.
И в индексе готовое значение хранится.
5 авг 11, 13:01    [11075989]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Уленшпигель
Member

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

но ведь все равно его хотя бы раз надо вычислить. а вдруг update поля-источника данных произойдет? опять вычислять надо! :)
5 авг 11, 13:12    [11076080]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Hamster_Rulik
Member

Откуда: Киев
Сообщений: 27
Спасибо господа за помощь...
Решил проблему с помощью преобразования даты
CONVERT(CHAR(8),dt,112) 
другие варианты не подошли:
DATEADD(DAY, DATEDIFF(0,dt),0)
требуем третий параметр
enddate
CAST(CAST(mydate as int) as datetime)
возвращает дату со временем

Ясно, что сначала надо навести порядок в этом бардаке и сохранять эти поля сразу с нулевым временем.
База разработчиков, вносить в нее коррективы нельзя...
5 авг 11, 13:38    [11076269]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Hamster_Rulik
другие варианты не подошли:
DATEADD(DAY, DATEDIFF(0,dt),0)
требуем третий параметр
Посмотреть Help не пробовали? Иногда помогает:
DATEADD(DAY, DATEDIFF(DAY,0,dt),0)
5 авг 11, 13:57    [11076440]     Ответить | Цитировать Сообщить модератору
 Re: Исключение времени при сравнивании дат  [new]
Уленшпигель
Member

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

со временем, конечно. только там нули всегда стоят
5 авг 11, 14:26    [11076621]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить