2015-10-09 2 views
0

У нас есть столбец date_value и другой булевский столбец, который указывает, является ли день рабочим днем ​​или нет.Найти первый день работы следующего месяца MySQL без функции

Мы пытаемся найти первый рабочий день следующего месяца (например, за сентябрь, 2015 Я хочу, чтобы вернуться 2015-10-01)

Мы пытались несколько различных методов, связанных с LAST_DAY, интервалы и подзапросы, но не могут заставить его работать.

У нас также нет возможности создавать пользовательские функции, что делает это немного сложнее.

+0

Что это надо делать с SQL? – Strawberry

+1

Покажите, что вы пробовали. Решение похоже на: поиск первого дня следующего месяца, определение дня недели (от 1 до 7) и добавление X дней для поиска первого рабочего дня (X - количество дней до следующего Понедельник). Удачи вам в том, что с функциями даты Mysql. – rlanvin

+0

@ Струберри я не понимаю. Мы ищем способ сделать это в MySQL. – Alex

ответ

0

Я думаю, что вы хотите что-то вроде этого:

select min(date_value) fwd 
from tablename 
where isWorkDay = 1 and 
     extract(year from date_value)=extract(year from curdate()) and 
     extract(month from date_value)=extract(month from curdate()) + 1 

За все месяцы (v0.3) (Обратите внимание, что я могу проверить это сейчас, так что он может иметь некоторую ошибку):

select t1.month_number, min(t2.date_value) 

from tablename t1 join 
    tablename t2 on extract(year from t1.date_value) * 12 + t1.month_number = extract(year from t2.date_value) * 12 + t2.month_number - 1 

where t2.isWorkDay = 1 

group by t1.month_number 
+0

То, что прямо на линии, на что я смотрю, и работает отлично в течение текущего месяца ... проблема в том, что мне нужно применять его к каждому месяцу исторически ... в настоящее время работая над модификацией, но если у вас есть одна от верхней части головы, я буду благодарен. – Alex

+0

Вы получили «текущий месяц»? От date_value? – CFreitas

+0

Да, я использовал месяц (date_value). У нас также есть столбец month_number – Alex

0

я был в состоянии получить его, используя ниже

SELECT 
d.year 
,d.month_number 
,first_business_period as next_month_first_period 
,d2.previous_business_day 
FROM lk_date d 
    JOIN (
    SELECT 
     a.* 
     , MAX(CASE WHEN d2.business_period_in_days<>0 THEN d2.date_value ELSE NULL END) AS previous_business_day 
    FROM(
    SELECT 
       d1.year 
       ,d1.month_number 
       , MIN(CASE WHEN d1.business_period_in_days <> 0 THEN d1.date_value END) AS first_business_period 
    FROM lk_date d1 
    GROUP BY 1,2 
     ) a 
    JOIN lk_date d2 ON d2.date_Value < a.first_business_period 
    GROUP BY 1,2,3) d2 on d2.previous_business_day = d.date_value 
Смежные вопросы