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

Откуда:
Сообщений: 339
Есть таблица Status , там такое поле LastOccurrence типа datetime.Хочу писать такой запрос select * from Status where LastOccurrence >'11-12-2011' где 11-месяц 12 -день 2011 -год но туда и '11-12-2011' тоже попадает.Как можно подругому?
23 дек 11, 11:21    [11813429]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
libru
Member

Откуда:
Сообщений: 877
яннп
23 дек 11, 11:23    [11813437]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
YYYYMMDD работает всегда корректно вне зависимости от языка логина.
23 дек 11, 11:25    [11813448]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Karen__84
Есть таблица Status , там такое поле LastOccurrence типа datetime.Хочу писать такой запрос select * from Status where LastOccurrence >'11-12-2011' где 11-месяц 12 -день 2011 -год но туда и '11-12-2011' тоже попадает.Как можно подругому?
select * from Status where LastOccurrence >='20111113' 
23 дек 11, 11:29    [11813479]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
Karen__84
Member

Откуда:
Сообщений: 339
alexeyvg,
когда делаю select * from Status where LastOccurrence > '20111113'
2011-11-13 22:07:00.000
2011-11-13 22:07:00.000
2011-11-13 14:26:00.000
2011-11-13 04:22:16.000
2011-11-13 12:39:00.000
2011-11-13 23:18:28.000
*
*
*
*
но они не должны попасть в результат
23 дек 11, 11:55    [11813761]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
Glory
Member

Откуда:
Сообщений: 104751
Karen__84
но они не должны попасть в результат

Вы считаете, что 2011-11-13 22:07:00.000 меньше, чем 2011-11-13 00:00:00.000 ?
23 дек 11, 11:59    [11813813]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
CrazHunt
Guest
ну тогда 20111114 поставь и будет счастье=)
23 дек 11, 11:59    [11813815]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Karen__84
alexeyvg,
когда делаю select * from Status where LastOccurrence > '20111113'
2011-11-13 22:07:00.000
2011-11-13 22:07:00.000
2011-11-13 14:26:00.000
2011-11-13 04:22:16.000
2011-11-13 12:39:00.000
2011-11-13 23:18:28.000
*
*
*
*
но они не должны попасть в результат
А вы писали, что должны

Тогда сформулируйте задачу. Какие должны попасть? которые меньше?
23 дек 11, 12:00    [11813820]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
CrazHunt
ну тогда 20111114 поставь и будет счастье=)
Боюсь, опять не поймёт :-(
23 дек 11, 12:00    [11813824]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
Karen__84
Member

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

понял , спасибо!
23 дек 11, 12:01    [11813838]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
danatriel
Member

Откуда: Ростов-на-Дону
Сообщений: 176
Karen__84,

Можно еще сравнивать только даты (без времени)
Тогда твой запрос будет корректно работать,но придется добавить функцию:)

CREATE FUNCTION [dbo].[DateOnly]  (@Dat1 dateTime)  
RETURNS datetime AS  
BEGIN 
declare @retValue dateTime
set @RetValue=cast(convert(nvarchar, @dat1, 112) as datetime)
return @RetValue
END
23 дек 11, 13:22    [11814594]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
libru
Member

Откуда:
Сообщений: 877
danatriel
Можно еще сравнивать только даты (без времени)
Тогда твой запрос будет корректно работатьхерить индексы
паправел
23 дек 11, 13:25    [11814644]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
danatriel
Member

Откуда: Ростов-на-Дону
Сообщений: 176
libru,

Сильно спорить не буду, ибо не гуру, а рядовой программист, просто объясни почему запрос на выборку будет херить индексы?
23 дек 11, 13:27    [11814668]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
libru
Member

Откуда:
Сообщений: 877
ну а что делать бедному оптимизатору когда он видит что на поле наложили функцию?
он же не искуственный интелект, он же не может понять, что программист когда писал функцию то задумывал вырезать время
23 дек 11, 13:33    [11814747]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
danatriel
Member

Откуда: Ростов-на-Дону
Сообщений: 176
libru,

я тебя все равно не понимаю. видать не выспался
что тут непонятного?
SELECT * FROM table WHERE dbo.DateOnly(dtm)>'2011-11-11'
23 дек 11, 13:38    [11814795]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
Гавриленко Сергей Алексеевич
Member

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

я тебя все равно не понимаю. видать не выспался
что тут непонятного?
SELECT * FROM table WHERE dbo.DateOnly(dtm)>'2011-11-11'
Не надо так делать.
23 дек 11, 13:39    [11814803]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
libru
Member

Откуда:
Сообщений: 877
danatriel
что тут непонятного?
SELECT * FROM table WHERE dbo.DateOnly(dtm)>'2011-11-11'
а ты поставь себя на место оптимизатора и попытайся понять как он может определить - использовать тут индекс по полю dtm или не использовать
(допустим индекс есть)
23 дек 11, 13:43    [11814837]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
danatriel
Member

Откуда: Ростов-на-Дону
Сообщений: 176
libru,

аа, ну эт да:) Если индекс есть, то не айс))
Но в вопросе то не сказано, что есть индекс:P
23 дек 11, 13:44    [11814853]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
danatriel
libru,

аа, ну эт да:) Если индекс есть, то не айс))
Но в вопросе то не сказано, что есть индекс:P
Если его нет, то надо сделать.
И тогда - см. 11814644
23 дек 11, 13:53    [11814939]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
danatriel
Member

Откуда: Ростов-на-Дону
Сообщений: 176
Гавриленко Сергей Алексеевич,

совсем что-то запутался. уволюсь к черту. Есть у нас система, очень большой компании, которая работает по всей России и в БД этой компании используется такой вариант выборки и все прекрасно работает. Я не думаю, что там глупые люди сидят. Как быть то?
P.S. само собой поля даты не индексированы
23 дек 11, 13:53    [11814943]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
danatriel
Есть у нас система, очень большой компании, которая работает по всей России и в БД этой компании используется такой вариант выборки и все прекрасно работает. Я не думаю, что там глупые люди сидят.
Судя по этим фразам неумные люди сидят. Профнепригодные.
danatriel
P.S. само собой поля даты не индексированы
Ну это само собой! О чём тут говорить!
23 дек 11, 13:59    [11814993]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
danatriel
Гавриленко Сергей Алексеевич,

совсем что-то запутался. уволюсь к черту. Есть у нас система, очень большой компании, которая работает по всей России и в БД этой компании используется такой вариант выборки и все прекрасно работает. Я не думаю, что там глупые люди сидят. Как быть то?
P.S. само собой поля даты не индексированы
Такой вариант - самый плохое, что можно было сделать, даже обычный cast без функции лучше. Но еще лучше вариан написать
dtm >= '2011-11-11' and dtm  < '2011-11-12'

Это как минимум не будет морочить голову оптимизатору, а как максимум - позволит серверу использовать индекс по дате, если он, конечно, будет (и будет нужен).

Сообщение было отредактировано: 23 дек 11, 14:01
23 дек 11, 14:00    [11814998]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
danatriel
Member

Откуда: Ростов-на-Дону
Сообщений: 176
iap,

У Вас в проектах во всех таблицах все поля даты индексированы?
23 дек 11, 14:01    [11815009]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Гавриленко Сергей Алексеевич
danatriel
Гавриленко Сергей Алексеевич,

совсем что-то запутался. уволюсь к черту. Есть у нас система, очень большой компании, которая работает по всей России и в БД этой компании используется такой вариант выборки и все прекрасно работает. Я не думаю, что там глупые люди сидят. Как быть то?
P.S. само собой поля даты не индексированы
Такой вариант - самый плохое, что можно было сделать, даже обычный cast без функции лучше. Но еще лучше вариан написать
dtm >= '2011-11-11' and dtm  < '2011-11-12'

Это как минимум не будет морочить голову оптимизатору, а как максимум - сможет использовать индекс по дате, если он, конечно, будет (и будет нужен).
Как раз дата-то нужна была больше '20111111', если из неё выкинуть время.
Поэтому, если быть точным надо
dtm>='20111112'
23 дек 11, 14:02    [11815015]     Ответить | Цитировать Сообщить модератору
 Re: Как написать where к полю DateTime  [new]
iap
Member

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

У Вас в проектах во всех таблицах все поля даты индексированы?
Если по ним делается выборка, то безусловно.
23 дек 11, 14:03    [11815023]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить