Преобразуйте поля даты и времени SQL-сервера для сравнения частей даты только с индексируемыми поисками

28
задан Adam Lear 6 December 2011 в 05:02
поделиться

5 ответов

Преобразование числовых типов для строкового представления значений (тип Упаковки) не является лучшим методом выполнения выполнения, что Вы ищете. Не действительно об индексируемом, потому что фактический тип столбца является временем даты.

при поиске лучшего способа запрос для дат, тогда пример является правильным, но можно хотеть принять во внимание различие в точности на 3 мс в MSSQL. Это может означать, что записи с одного дня могут обнаружиться в результате другого дня.

Это

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'

Должно быть этим

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<='08-14-2008 23:59:59.996'
5
ответ дан StingyJack 28 November 2019 в 02:39
поделиться

Лучший способ лишить часть времени поля даты и времени использует функции dateadd и datediff.

   DateAdd(day, datediff(day,0, MydateValue), 0)

Это берет advantedge того, что SQL Server хранит даты как два целых числа, одно представление количества дней со дня "0" - (1 января 1900), и второй, который представляет количество [1 111] галочки (каждая галочка составляет приблизительно 3,33 мс) с полуночи (в течение времени) *.

формула выше просто должна только считать первое целое число. Нет никакого преобразования или обработки необходимого, таким образом, это чрезвычайно быстро.

, Чтобы заставить Ваши запросы использовать индекс... используют эту формулу на входных параметрах фильтрации сначала, или на "другой" стороне знака "равно" от поля времени даты таблиц, так, чтобы оптимизатор запросов не выполнял вычисление на каждом поле даты и времени в таблице для определения, какие строки удовлетворяют предикат фильтра. Это приводит Ваш поисковый "SARG-способный" аргумент (Поисковый Аргумент)

Where MyDateTimeColumn > DateAdd(day, 
      datediff(day,0, @MydateParameter), 0)    -- SARG-able

, а не

Where DateAdd(day, datediff(day,0, 
      MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able

* ПРИМЕЧАНИЕ. Внутренне, второе целое число (часть времени) хранит галочки. За день существует 24 x 60 X 60 X 300 = 25 920 000 галочек (случайно чуть ниже макс. значения, которое целое число на 32 бита может содержать). Однако Вы не должны волноваться об этом, арифметически изменяя дату и время... При добавлении или вычитании значений из datetimes можно рассматривать значение как часть, как будто это было точно равно дробной части дня, как будто полное значение даты и времени было числом с плавающей точкой, состоящим из целочисленной части, представляющей дату и дробную часть, представляющую время). т.е.

`Declare @Dt DateTime  Set @Dt = getdate()  
 Set @Dt = @Dt + 1.0/24  -- Adds one hour  
 Select @Dt  
 Set @Dt = @Dt - .25 -- Moves back 6 hours  
 Select @Dt`
67
ответ дан David Gardiner 28 November 2019 в 02:39
поделиться

Это корректно - выполнение преобразования выполнит преобразование для каждой запрошенной строки. Лучше оставить столбцы даты как даты и передачу в Вашем где пункты как даты:

select * from appointments where appointmentdate between 
'08/01/2008' AND '08/16/2008'

Примечание: Бросание времени означает полночь (00:00.000), таким образом, Вы будете включать все случаи для 08/01 и все случаи от 08/15 и чего-либо, что является точно 16.08.2008 0:00:00

2
ответ дан Kieveli 28 November 2019 в 02:39
поделиться

Имейте вычисленный сохраненный столбец, вычисляют выражение, в котором Вы нуждаетесь. Если столбцы вычисляются и сохраняются, они могут также быть индексированы.

1
ответ дан devio 28 November 2019 в 02:39
поделиться

Существует также способ, описанный в http://www.stillnetstudios.com/comparing-dates-without-times-in-sql-server/

SELECT CAST(FLOOR(CAST( getdate() AS float )) AS datetime)
0
ответ дан Mladen Mihajlovic 28 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: