SQL-запрос для строк с наименьшим временем - PullRequest
1 голос
/ 01 февраля 2010

У меня есть таблица с одним столбцом DateTime. Я хочу найти строки с наименьшим временем, которые их время больше, чем переменная myTime. Как я могу это сделать? Какой индекс повысит производительность?

Ответы [ 4 ]

2 голосов
/ 01 февраля 2010

Использование TOP (SQL Server 2000 +)


SELECT t.*
  FROM TABLE t
 WHERE t.date_time_col = (SELECT TOP 1
                                 x.date_time_col
                            FROM TABLE x
                           WHERE CONVERT(hh, x.date_time_col, 8) < @myTime
                        ORDER BY x.date_time_col)

Использование MIN


SELECT t.*
  FROM TABLE t
 WHERE t.date_time_col = (SELECT MIN(x.date_time_col)
                            FROM TABLE x
                           WHERE CONVERT(hh, x.date_time_col, 8) < @myTime)

Ни один из них не будет использовать индекс, если он существует в столбце DATETIME из-за использования функции - тип данных изменяется.

1 голос
/ 01 февраля 2010

Как то так ...

DECLARE @temp datetime

SET @temp = (SELECT GETDATE())

Select myCol from MyTable where MyColWithDate IN (SELECT top 1 MyCol, MyCol2 FROM MyTable WHERE MyColWithDate > @temp ORDER BY MyColWithDate ASC)

или я бы, наверное, пошел с MIN

Select myCol from MyTable where MyColWithDate IN (SELECT MIN(MycolWithDAte) FROM MyTable WHERE MyColWithDate > @temp GROUP BY MyColWithDate)
1 голос
/ 01 февраля 2010
SELECT DateTime1
FROM Table1
WHERE DateTime1 = (
    SELECT MIN(DateTime1)
    FROM Table1
    WHERE DateTime1 > @myTime);

или

SELECT T1.DateTime1
FROM Table1 AS T1
JOIN (
    SELECT MIN(DateTime1) AS DateTime1
    FROM Table1
    WHERE DateTime1 > @myTime) AS T2
ON T1.DateTime1 = T2.DateTime1;

Запустите оба, чтобы увидеть, какой из них самый быстрый. Используйте индекс на DateTime1.

Тестовые данные для проверки работоспособности:

CREATE TABLE Table1 (DateTime1 NVARCHAR(100) NOT NULL);
INSERT INTO Table1 (DateTime1) VALUES
('2010-02-01 17:53'),
('2010-02-01 17:55'),
('2010-02-01 17:55'),
('2010-02-01 17:56');
0 голосов
/ 01 февраля 2010
DECLARE @temp datetime

SET @temp = (SELECT GETDATE())

SELECT MyCol, MyCol2 FROM MyTable WHERE MyColWithDate > @temp ORDER BY MyColWithDate ASC

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...