2009-10-13 2 views
0

Использование SQL Server 2005Как подсчитать количество дней?

Table1

ID FromDate ToDate 

001 23-02-2009 25-02-2009 
001 27-02-2009 29-02-2009 
002 12-02-2009, 25-03-2009 

...

Table2

ID Name Total 

001 Raja 30 
002 Ravi 22 

Я хочу, чтобы получить общий день для PersonId

Попробованная запрос,

SELECT 
    table2.Id, table2.name, table2.total, 
    datediff(day, table1.fromdate, table2.todate) 
FROM table1 
LEFT OUTER JOIN table2 ON table1.personid = table2.personid 

Получение выход

ID Name Total Days 

001 Raja 30 3 
001 Raja 30 3 
..., 

Он должен составлять дни, и она должна отображаться в одной строке,

Примечание: Предположим, я выбрать конкретную дату периода означает, что она должна показать, что только дни

Например,

где дата между 26-02-2009 по 03-03-2009, он должен отображать

ID Name Total Days 

001 Raja 30 3 
..., 

Поскольку дата везет после 25.02.2009,

Expected Output 

ID Name Total Days 

001 Raja 30 6 
002 Ravi 22 16 

Как изменить мой запрос?

+2

Кстати, в данных дампа вы включены в table1 , 29-02-2009 - недействительная дата. 2009 год не был високосным годом, и SQL Server громко кричит. –

ответ

0

DATEDIFF дает количество разницы дней между двумя датами, так и в том же образом различались между 1 и 3 2 (3 - 1 = 2), DATEDIFF (d) - фактически D2 - D1. Таким образом, чтобы компенсировать дополнительный день вы хотите посчитать, что вам нужно DATEADD день либо (ToDate или FromDate), чтобы компенсировать ваши даты:

SELECT table2.id, table2.Name, table2.Total, SUM(DATEDIFF(d, DATEADD(d, -1, table1.FromDate), table1.ToDate)) 
    FROM table1 
     INNER JOIN table2 ON table1.id = table2.id 
    GROUP BY table2.id, table2.Name, table2.Total 
0
SELECT table2.Id, table2.name, table2.total, 
     COALESCE(
     (
     SELECT SUM(DATEDIFF(day, table1.fromdate, table1.todate) + 1) 
     FROM table1 
     WHERE table1.personid = table2.personid 
     ), 0) AS [days] 
FROM table2 
+0

Нет, я использую DATEDIFF (day, table1.fromdate, table1.todate), так что предположим fromdate = 24-02-2009 и todate = 28-02-2009 означает, что он должен давать всего 5 дней, но теперь он дает 3 дней. Это избегает 24 и 28. Как получить этот счет. – Gopal

+0

См. Обновление сообщения. Если ваши даты '24-02-2009' и' 28-02-2009', 'DATEDIFF' предоставит вам' 4' дней, а не '3'. – Quassnoi

0

Я думаю, что GROUP BY запроса будет проще:

SELECT table2.Id, table2.name, table2.total, 
SUM(DATEDIFF(day, table1.fromdate, table1.todate)) AS Days 
FROM table1 
left outer join table2 on 
table1.personid = table2.personid 
GROUP BY table2.Id, table2.name, table2.total 
+0

Нет, я использую DATEDIFF (day, table1.fromdate, table1.todate), так что предположим fromdate = 24-02-2009 и todate = 28-02-2009 означает, что он должен давать всего 5 дней, но теперь он дает 3 дней. Это избегает 24 и 28. Как получить этот счет. – Gopal

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