2013-08-27 7 views
0

Мне нужно рассчитать количество дней в день (например, & в четверг) между двумя датами.Подсчитайте конкретные дни недели между двумя датами

Я знаю о функции времени и всех связанных, но я не знаю, как их использовать в этом контексте.


Проблема решена в двух решениях, но, похоже, я не могу выбрать решение для стенда. Спасибо Andrius Naruševičius и Kickstart для просветления: D

+0

это работает для вас? http://stackoverflow.com/questions/2546053/mysql-difference-between-two-timestamps-in-days – alpera

+0

Google first -.- Первый результат делает то, что вы хотите - http://stackoverflow.com/questions/9757919/ count-days-between-two-dates-excluding-weekendends-mysql-only –

+0

@alpera IMHO, dateiff count, сколько дней между датой. Мне нужны только благоприятные дни – Smiley

ответ

1

Метод взят и адаптирован из here

@S   = start date 
@E   = end date, not inclusive 
@full_weeks = floor((@[email protected])/7) 
@days  = (@[email protected]) - @full_weeks*7 OR (@[email protected]) % 7 

SELECT 
    @full_weeks*1 -- saturday 
+IF(@days >= 1 AND weekday(S+0)=5, 1, 0) 
+IF(@days >= 2 AND weekday(S+1)=5, 1, 0) 
+IF(@days >= 3 AND weekday(S+2)=5, 1, 0) 
+IF(@days >= 4 AND weekday(S+3)=5, 1, 0) 
+IF(@days >= 5 AND weekday(S+4)=5, 1, 0) 
+IF(@days >= 6 AND weekday(S+5)=5, 1, 0) 

Done.

Working SQL Fiddle

+0

1. @ full_weeks * 1 - суббота (что здесь означает 1?) – Smiley

+0

2. почему он должен ... = 5 ???? – Smiley

+0

Я пробую с датой начала '2013-08-01' и окончательной датой '2013-08-27', результат 3. Если он считает субботу, это должно быть 4, правильно? – Smiley

1

Альтернативный способ сделать это с ЗЕЬЕСТОМ: -

SELECT DAYNAME(DATE_ADD(@StartDate, INTERVAL (Units.i + Tens.i * 10 + Hundreds.i * 100) DAY)) AS aDayOfWeek, COUNT(*) 
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Units 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Tens 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Hundreds 
WHERE DATE_ADD(@StartDate, INTERVAL (Units.i + Tens.i * 10 + Hundreds.i * 100) DAY) <= @EndDate 
GROUP BY aDayOfWeek 

Это будет работать с датами до 1000 дней друга от друга, но легко расширить его для больших диапазонов дат.

Что он делает, это генерировать диапазон чисел (начиная с 0) и добавлять их к дате начала, где результат равен < = до даты окончания. Затем получайте имена дня каждого из них и получайте счет каждого из них.

+0

это хорошо работает, просто нужно внести некоторые исправления для моего проблемы ... Спасибо Bro =)) – Smiley

0

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

select count(*) 
from calendar 
where cal_date between '2013-03-01' and '2013-03-31' 
    and day_of_week in ('Wed', 'Thu') 

count 
-- 
8 

Чтобы увеличить его, чтобы подсчитать воскресенье, просто добавьте «Солнце» в пункт IN. (Хотя я должен сказать, что это поражает меня как-то странное, что нужно сделать.)

select count(*) 
from calendar 
where cal_date between '2013-03-01' and '2013-03-31' 
    and day_of_week in ('Wed', 'Thu', 'Sun') 

count 
-- 
13 

Вот code for a calendar table in PostgreSQL. Вам придется перепрыгнуть через некоторые обручи, чтобы перевести его для MySQL, потому что MySQL не применяет ограничения CHECK.

+0

К сожалению, я не хочу использовать для этого какую-либо таблицу, всего один запрос. Но это можно сделать, когда вы сочетаетесь с этим решением http://stackoverflow.com/questions/9295616/how-to-get-list-of-dates-between-two-dates-in-mysql-select-query?lq= 1 .... спасибо за идею :) – Smiley

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