2009-11-23 3 views
2

У меня есть таблица, которая выглядит следующим образом:SQL DATEDIFF через другие смежные даты

Code Mark Date Notional 
Beta 5/1/2008 $1,102,451.00 
Beta 5/2/2008 $1,102,451.00 
Beta 5/5/2008 $1,102,451.00 
Beta 5/6/2008 $1,102,451.00 

Мне нужно создать таблицу, которая имеет все Знак дату в одном столбце, а разница между каждой смежной Маркой Дата сортировки в другом столбце. Это SQL я написал:

SELECT 
    Current.[Mark Date], 
    Prev.[Mark Date], 
    (DATEDIFF("d", Prev.[Mark Date], Current.[Mark Date])/365) 

FROM Notional as Prev, Notional as Current 
WHERE (Prev.[Mark Date] = (Current.[Mark Date]-1)); 

Однако это SQL не будет вступать в выходные дни 5/5/2008 -> 5/2/2008, например, или на длинные выходные. Как я мог бы заставить таблицу самостоятельно присоединиться к нескончаемым датам? Спасибо за помощь!

+0

Мне просто интересно об этом. Есть ли таблица с именем «Условное» и поле «Обозначение»? Кроме того, что вы имеете в виду, когда говорите «этот SQL не будет вступать?». Можете ли вы привести пример? – PowerUser

+0

Можете ли вы не использовать заявление CASE в день недели, чтобы присоединиться к понедельнику до пятницы tue to mon weds to tues etc etc – AntDC

ответ

1

Единственный способ сделать это состоит в использовании ROW_NUMBER (и ROW_NUMBER + 1) на выбор упорядочены по дате для SQL, который поддерживает номера строк или создать временную таблицу с ключом автоматического увеличения, который вы заполняете в порядке даты.

Там нет другого пути, не прибегая к не присоединиться решения (то есть петля.)

+0

Хорошо, да, мне нужно создать временную таблицу с ключом автоматического увеличения, потому что я использую ACCESS 2007 ... любую идею о том, как это сделать? –

+0

не с моей головы - я верю в доступ к использованию ключевого слова auto при объявлении таблицы. убедитесь, что если вы создаете временную таблицу, вы не помещаете все поля в таблицу temp. Лучше всего иметь временную таблицу с двумя полями - autoinckey и внешний ключ (внешний ключ указывает на клавишу «условная таблица»). Это будет быстрее. – Hogan

+0

Это неправда. Это можно сделать без использования циклов. Пожалуйста, см. Мой ответ для краткого описания –

1

Вы можете попробовать использовать ROW_NUMBER при выборе и присоединении к этому заказу к дате.

EDIT. Выполнено с соединениями.

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

Что-то вроде этого

DECLARE @Table TABLE(
     DateVal DATETIME 
) 

INSERT INTO @Table SELECT '01 May 2009' 
INSERT INTO @Table SELECT '02 May 2009' 
INSERT INTO @Table SELECT '05 May 2009' 
INSERT INTO @Table SELECT '06 May 2009' 

SELECT t.DateVal, 
     MIN(tNext.DateVal) NextDate 
FROM @Table t LEFT JOIN 
     @Table tNext ON t.DateVal < tNext.DateVal 
GROUP BY t.DateVal 

Я знаю, что это Sql код сервера, но может быть легко изменен на MS Access.

Это должно вернуться на следующие:

StartDate     EndDate 
2009-05-01 00:00:00.000 2009-05-02 00:00:00.000 
2009-05-02 00:00:00.000 2009-05-05 00:00:00.000 
2009-05-05 00:00:00.000 2009-05-06 00:00:00.000 
2009-05-06 00:00:00.000 NULL 
+0

Это считается хорошей форме? –