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

Откуда:
Сообщений: 44
Хочу выбрать данные на отрезке времени
SELECT *
FROM [TBDB].[dbo].[ALL_DE]
WHERE ([TIME]>='23:10:03' AND [DATE]>='10.05.2011')
AND ([TIME]<='13:10:03' AND [DATE]<='11.05.2011')
ORDER BY [ID]

то есть выборка задумана как данные со времен больше такого-то и меньше такого-то
поле TIME и DATE - varchar
Если убрать одну границу выборки - начало или конец временного отрезка, то все работает. Такое ощущение, что скобки компилятором нераспарсиваются и получается взаимоисключающиеся условия, которые не дают в выборке результатов.

Подскажите как правильно составить запрос при таких исходных?
11 май 11, 13:27    [10634792]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
конвертируйте в DATATIME
11 май 11, 13:31    [10634838]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

Откуда:
Сообщений: 44
Knyazev Alexey,
не могу, данные формирую не я, как есть - так есть.
11 май 11, 13:34    [10634876]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
iap
Member

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

как по-Вашему, что больше: '10.05.2011' или '11.04.2011'?
11 май 11, 13:34    [10634879]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

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

Так я скобками обозначил, что одновременно должны быть первые 2 условия и одновременно вторые два.
очевидно что больше 2ое, но мне нужно отдельно
условие 1) ([TIME]>='23:10:03' AND [DATE]>='10.05.2011')
условие 2) ([TIME]<='13:10:03' AND [DATE]<='11.05.2011')

надеюсь логика понятна?
На фокспро при таком же формате данных, такой запрос успешно исполняется

Если мне нужна запись от 11.05.2011 в 10:00:00, как мне ее выбрать?
11 май 11, 13:47    [10635033]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
Gwa
Guest
rfrfylegtk,
попробуйте

WHERE
([Date] between '10.05.2011' And '11.05.2011')
And
([Time] between '23:10:03' And '13:10:03')
11 май 11, 13:53    [10635104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
rfrfylegtk
iap,

надеюсь логика понятна?
Нет никакой логики.
Чтобы результат сравнения строковых представлений дат совпал с результатом сравнения самих дат,
надо, чтобы в этом представлении части даты следовали от крупного к мелкому слева направо:
сначала год, потом месяц, потом день и т.д. Причём количество символов на каждую из них должно быть
постоянным: например, год - всегда 4 символа, месяц - всегда 2 символа, день - всегда 2 символа и т.д.
Эти части должны разделяться всегда одним и тем же разделителем (или вообще ничем не разделяться).

Такая логика понятна?
Но лучше даты-время сравнивать в типах даты-времени.
11 май 11, 14:02    [10635209]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
iljy
Member

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

это вы у себя спросите - понятна ли вам логика. Операции логического умножения в полной мере обладают ассоциативностью и коммутативностью. Какое время может удовлетворять условию [TIME]>='23:10:03' AND [TIME]<='13:10:03' ?
11 май 11, 14:04    [10635224]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

Откуда:
Сообщений: 44
Gwa,
нулевая выборка
2ое условие взаимосиключающее
11 май 11, 14:05    [10635232]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

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

Ну окей
как составить запрос чтобы выбиралось между временем + дата и временем + дата при том что они представлены varchar?
11 май 11, 14:06    [10635248]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
rfrfylegtk
iljy,

Ну окей
как составить запрос чтобы выбиралось между временем + дата и временем + дата при том что они представлены varchar?
Сначала приводить к нормальному виду, потом сравнивать.
11 май 11, 14:08    [10635272]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
Gwa
Guest
rfrfylegtk
Gwa,
нулевая выборка
2ое условие взаимосиключающее

А что поля действительно varchar?
Ну тогда как и советовали приводить к типу DateTime
(прямо в запросе делать приведение)
11 май 11, 14:14    [10635324]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

Откуда:
Сообщений: 44
Gwa
rfrfylegtk
Gwa,
нулевая выборка
2ое условие взаимосиключающее

А что поля действительно varchar?
Ну тогда как и советовали приводить к типу DateTime
(прямо в запросе делать приведение)


это как?
11 май 11, 14:21    [10635399]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
Gwa
Guest
rfrfylegtk
Gwa
пропущено...

А что поля действительно varchar?
Ну тогда как и советовали приводить к типу DateTime
(прямо в запросе делать приведение)


это как?

CAST ( expression AS data_type [ (length ) ])
или
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
11 май 11, 14:24    [10635427]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
Gwa
Guest
например,
select cast('05/13/2011 13:00' As DateTime) As Dt
11 май 11, 14:29    [10635481]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

Откуда:
Сообщений: 44
Gwa,
ок попробую
11 май 11, 15:15    [10635973]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Gwa
например,
select cast('05/13/2011 13:00' As DateTime) As Dt
Ай, молодца!
А разве тринадцатый месяц бывает?
11 май 11, 15:35    [10636222]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

Откуда:
Сообщений: 44
решено было проще
([DATE] + [TIME] <='11.05.201113:10:03')
AND ([DATE] + [TIME]>='10.05.201123:10:03')
11 май 11, 15:56    [10636447]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
rfrfylegtk
решено было проще
([DATE] + [TIME] <='11.05.201113:10:03')
AND ([DATE] + [TIME]>='10.05.201123:10:03')


тока не забывается что потом придет новый пользователь с китайским языком и ваша конструкция 13.05.201113:10:03 выпадет в raiserror:) потому что 13 месяца небывает
11 май 11, 16:15    [10636662]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WarAnt
rfrfylegtk
решено было проще
([DATE] + [TIME] <='11.05.201113:10:03')
AND ([DATE] + [TIME]>='10.05.201123:10:03')


тока не забывается что потом придет новый пользователь с китайским языком и ваша конструкция 13.05.201113:10:03 выпадет в raiserror:) потому что 13 месяца небывает
Дело даже не в этом.
Вот так вернёт TRUE для 10.07.2011 (формат DMY):
    [DATE] + [TIME]<='11.05.201113:10:03'
AND [DATE] + [TIME]>='10.06.201123:10:03'
Но разве это будет правильно?!
11 май 11, 16:26    [10636753]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
egaraev
Member

Откуда:
Сообщений: 63
Нужно преобразовать [DATE] + [TIME] в DateTime а потом сравнить полученное с переменными типа DateTime.
11 май 11, 16:32    [10636815]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
--не будут работать индексы
SELECT *
  FROM [TBDB].[dbo].[ALL_DE] t
 WHERE convert(datetime, t.[DATE] + t.[TIME], 104) 
       between '10.05.2011 23:10:03'
           and '11.05.2011 3:10:03'


SELECT *
  FROM [TBDB].[dbo].[ALL_DE] t
 WHERE t.[DATE] between '10.05.2011' --Тут сработает индекс
                    and '11.05.2011'            
   and convert(datetime, t.[DATE] + t.[TIME], 104) --тут не сработает индекс
       between '10.05.2011 23:10:03'
           and '11.05.2011 3:10:03'
           
           
SELECT *
  FROM [TBDB].[dbo].[ALL_DE] t
 WHERE t.[DATE] between '10.05.2011' --Тут сработает индекс
                    and '11.05.2011'            
   --Сложно с OR-ами, можно ещё с case-ами
   and (
        t.[DATE] <> '10.05.2011' and t.[DATE] <> '11.05.2011'
        or
        t.[DATE] = '10.05.2011' and t.[TIME] >= '23:10:03'
        or
        t.[DATE] = '11.05.2011' and t.[TIME] <= '3:10:03'
       )
   
11 май 11, 19:17    [10637954]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
и ещё в переменные загнать значения.
11 май 11, 19:18    [10637959]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

Откуда:
Сообщений: 44
Всем спасибо
CAST помог
11 май 11, 20:00    [10638089]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить SQL запрос  [new]
rfrfylegtk
Member

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

Да, спасибо
Я тоже подумал над более сложными логическими конструкциями, но вот с CASTом поковырял и решилось. Сам небольшой спец в SQL, потому испытываю трудности на элементарных вещах.
11 май 11, 20:02    [10638098]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить