2016-03-25 5 views
0

У меня есть вопрос SQL, который я не смог решить какое-то время. Я повсюду смотрел без везения. Я потратил много времени на просмотр StackOverflow и подумал, что кто-то здесь может помочь.Расчет начальной даты в нескольких диапазонах дат

Мне нужно определить начальную дату x число дней назад на нескольких диапазонах. Например:

Range || Ending Date of Range (date) || Number of Days in Range (int) 
1  || 2/20/2013     ||   44 
2  || 9/5/2014     ||   75 
3  || 3/25/2016     ||   20 

У меня есть 3 диапазона продолжительностью различного времени с датой окончания для каждого. Диапазоны дат никогда не перекрываются. Мне нужно подсчитать конкретный номер, скажем, 100 дней, обратно в диапазон. В приведенном выше примере. Ответ будет 2/15/13.

20 + 75 = 95 дней. 100 - 95 = 5 дней. Таким образом, 5 дней назад с 2/20/2013 - 2/15/2013.

Кто-нибудь знает, как я могу это сделать в SQL-запросе?

Я считаю, что лучший способ заключается в объединении диапазонов до тех пор, пока сумма не пройдёт нужное число (100), а затем не примет разницу (95) и вычитает ее из (100), которая дала бы мне (5) просто простая математика. Я мог бы легко сделать это с любым языком программирования, но с SQL, с которым я борюсь.

Действительно, мне нужна помощь с приложением (5) и правильной датой окончания (20.02.2013). Оттуда я смогу обработать математику.

Я был бы признателен за любые рекомендации относительно того, как я мог бы это сделать. Заранее спасибо.

+0

Какие СУБД вы используете? Пожалуйста, пометьте его, поскольку каждый может иметь свои собственные функции (особенно, когда речь заходит о датах). –

+0

Я не могу понять это. почему вы оставили диапазон 1? Я думаю, вам нужно лучше объяснить логику здесь. Почему вы вычитаете 5 из диапазона 1? без разницы. –

+0

Том - DB2 ... Рикардо - Точка должна отсчитывать назад, чтобы добраться до 100. Диапазон дат 3 + Диапазон дат 2 = 95 Осталось 5, затем я могу пересчитать 5 дней в этом диапазоне. Извините, если я не понимаю. – jackfish

ответ

0

Я попробовал это в Sybase:

SELECT 
    max(CASE WHEN total_days >= chosen_days THEN end_date END) 
    - 
    min(CASE WHEN total_days < chosen_days THEN chosen_days - total_days ELSE chosen_days END) 
FROM 
    (
     SELECT a.end_date, sum(b.days_in_range) AS total_days, 100 AS chosen_days 
     FROM test AS a JOIN test AS b ON a.end_date <= b.end_date 
     GROUP BY a.end_date 
    ) AS x 
+0

Я ценю совет, который я посмотрю и посмотрю, что я могу сделать. Еще раз спасибо. – jackfish

Смежные вопросы