SQL - сравнить строки без касторов - PullRequest
4 голосов
/ 17 мая 2011

У меня есть временная таблица со следующими столбцами -

id              int identity(1,1)   NOT NULL
startDate       dateteime           NOT NULL
endDate         dateteime
amount          decimal(18,8)       NOT NULL

Мне нужно выполнить запрос, чтобы получить из него одно значение суммы столбца.

  • если макс. startDate равно <= сегодня, тогда сумма, соответствующая этой строке. </li>
  • если мин. startDate is> = today, то сумма, соответствующая этой строке.
  • если у нас есть строки с startDates меньшими, равными и большими, чем сегодня, то строка с startDate, ближайшая к <= сегодня, должна быть той, чье количество должно быть выбрано. Если ближайший <code>startDate (<=) к сегодняшнему дню имеет на <code>endDate меньше, чем сегодня, сумма выбора строки с startDate рядом с предыдущим.

Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Вы ищете ближайшую дату начала. Вы можете только заказать таблицу, а затем ограничить набор результатов! Проверьте это:

SET DATEFORMAT DMY

DECLARE @t TABLE (
    id uniqueidentifier NOT NULL, 
    startDate datetime NOT NULL,
    endDate datetime, 
    amount decimal(18,8)  NOT NULL)

INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.01.2009', NULL, 1.221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.03.2009', NULL, 1.221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.10.2011', NULL, 1.22)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '21.04.2011', NULL, 221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '11.06.2011', NULL, 199221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.01.2009', NULL, 1221)

SELECT TOP 1 * FROM @t
ORDER BY ABS(DATEDIFF(day, startDate, GETDATE()))
0 голосов
/ 18 мая 2011

Прочитав ваш вопрос, кажется, что вы просто хотите выбрать строку, где startDate является ближайшим к текущему дню.

Я думаю, что это должно дать вам это, если нет, пожалуйста, уточните ваши требования далее. Может быть, добавив некоторые примерные данные и ожидаемый результат.

Select Top 1 *
From YourTable
Where startDate = IsNull(
                (Select Max(startDate) from #t where startdate <= getdate()),
                    (Select Min(startDate) from #t where startdate >= getdate())
                        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...