консультируйся с рангами дат и стоимостью одного месяца

В моем app я считаю таблицу этой:

INACTIVITY:

id      user_id         start         end          comment
 265       2         29-04-2017    05-05-2017   Vacaciones
 356       2         07-04-2017    10-04-2017   Baja Enfermedad
 455      15         24-04-2017    24-08-2017   Maternidad

Говорится о влиянии, которое имеют трудящиеся, которые не позволяют ему работать. Чтобы производить сообщение отсутствия, я нуждаюсь в том, чтобы достать бездействие МЕСЯЦА и ГОДА, который они показывали бы мне.

Чтобы упрощать, я поместил пример мая, июня, июль и августа.

  • если они показывают меня в месяце 3, нет происшествий
  • если они показывают меня в месяце 4, я имею три типа влияния, один из пользователя 15 и другие пользователя 2
  • если они показывают меня в месяце 5, я имею два типа влияния (265 и 455, 365 только эта за месяц 4).
  • если они показывают меня в месяце 6, 7 или 8, было бы должно выходить одиноким происшествие 15.

В настоящее время, что я делаю:

  • я беру стоимость года и в месяце,
  • я считаю в дни этого месяца.
  • я получаю $inicio и $fin (будучи $inicio = 1/месяц / в год и $fin = dias_mes / месяц / в год)

С этим, я выполняю следующую консультацию:

Select * from Инактивити i where i.start> = $inicio AND i.end <= $fin

С этой консультацией только я получаю тех, которые в течение месяца, но не те, которые начались за предыдущий месяц Y, продолжают в месяц, или тех, которые начинаются в месяц и продолжают за следующий месяц. Ok. Я должен менять консультацию.

Я попытался менять консультацию в

select * from Inactivity i
where (i.start >=$inicio AND i.end <= $fin) 
OR (  ($inicio between i.start and i.end) AND ($fin between i.start and i.end) )

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

Я не вижу, как делать эту консультацию. У кого-то какая-то идея есть?

2
задан 27.06.2017, 14:55
3 ответа

Несмотря на то, что он делал бы OR между $inicio и $fin он был бы должен стоить тебе.

SELECT * FROM Inactivity i 
WHERE $inicio BETWEEN start AND end 
OR $fin BETWEEN start AND end

С этим ты приносишь реестры, если 1/месяц / a¦±o эта между start and end или finMes / месяц / a¦±o эта между start and end

1
ответ дан 24.11.2019, 07:57
  • 1
    Верно. Это возвращает мне данные о случаях конца. Но я появился случай что не coje, и он, когда дата конца - 1/месяц / añ число; или. Включение BETWEEN было бы должно принимать это, но не, из-за которого он это не делает. Я продолжу исследовать. – Jakala 29.06.2017, 09:27
  • 2
    Я увидел недавно твой комментарий, но уже он не. Ты это удалил? Ты был прав, я использую datetime завершаю и он не имел в виду начальный час с 0:00:00 и час конец 23:59:59. Большое спасибо, уже я исправил solució n. – Jakala 29.06.2017, 10:21
  • 3
    Если, я удалил ее, потому что я подумал, что он понял тебя плохо и не будет функционировать. – Lithorell 29.06.2017, 10:24

Способ получать данные в месяц и(или) año он с date_format, aquà - я оставляю тебе простой пример, también prod¦-схвати использовать between для condici¦n месяца.

SELECT * FROM inactivity i
WHERE DATE_FORMAT(start,'%Y') = 2017
AND DATE_FORMAT(start,'%m') <= '04'
AND DATE_FORMAT(end,'%m') >= '04'
0
ответ дан 24.11.2019, 07:57
  • 1
    В этой консультации у тебя есть 3 переменные (añ или, в месяце я инициализируюсь и в месяце конец), когда у единственного есть 2 (añ или и месяц) – Lithorell 27.06.2017, 15:12
  • 2
    В месяце начала и месяца конца они могут быть равны, или в случае, если он захочет видеть за несколько отличных месяцев, поэтому я даю ему альтернативу в примере. – Carmen 27.06.2017, 15:16
  • 3
    Нет, под Вашей проблемой в месяце я инициализируюсь и в месяце конца они всегда равны. И в этом случае твой query не функционирует, так как только приносятся реестры, которые инициализируются и заканчиваются за этот месяц, когда то, что он хочет, то что, период которого имел в какой-то день за указанный месяц. Также служащая, если он между несколькими месяцами, потому что он только принес бы тех, которых он инициализирует, и они кончаются этим периодом. – Lithorell 27.06.2017, 15:18
  • 4
    Например на месяц 4, твой query возвращает 1 единственный тип стоимости в то время как та, которая нуждается, была бы должна возвращать 3. – Lithorell 27.06.2017, 15:19
  • 5
    Tení эксперт razó n Lithorell, я поместил revé s > / < я despisté исправленный – Carmen 27.06.2017, 15:23

Хорошие,

в конце концов я восхвалил себя больше из-за soluci¦n Lithorell. Я был должен изменять вещь, которая мне не нравится, но которую я не могу завершить.

дал Себе другой случай, который в принципе консультация была бы должна cojerlo без проблем, но это не делает. Это следующий:

id      user_id         start         end          comment
471      18           24-04-2017    1-05-2017     Vacaciones

А именно, случай, что дата конца происшествия была 1-ым числом месяца, который мы ищем.

В конце концов, консультация осталась так:

SELECT * FROM Inactivity i 
WHERE (i.start BETWEEN $inicio AND $find) 
   OR (end BETWEEN $inicio AND $fin) 
   OR (start >= $inicio AND end <= $fin )
   OR (end = $diauno )

последний OR (end = $diauno) ссылается на этот 1 текущего месяца. Я не понимаю, из-за которого, но - ли дата конца 1/месяц / a¦±o консультация не coje вышеупомянутое происшествие.

, который является ñapa mu плохая, но, как я говорю вам, она не ли помещаю я не coje стоимость. Я проверил их < y>, дело не в том, что не было случая < = для añadirlo, но я не понимаю, из-за которого.

ИЗДАЛ:

, Обнаруженный неудачу вскоре после комментария Lithorell. Действительно, я использую datetimes, с hh:mm:ss. и точно стоимость, которую он не брал, состоит из-за моего вычисления $inicio и $fin, в том, что они datetimes с НАСТОЯЩИМ часом. Моя неудача.

Сейчас я исправляю такое вычисление $inicio и $fin:

$start = new \Datetime($start->format('Y-m-d'));
$end = new \Datetime($end->format('Y-m-d 23:59:59'));

И консультация остается сейчас:

SELECT * FROM Inactivity i 
WHERE (i.start BETWEEN $inicio AND $find) 
   OR (end BETWEEN $inicio AND $fin) 
   OR (start >= $inicio AND end <= $fin )

и с этим ЕСЛИ, что coje ранее прокомментированная стоимость. Как я говорю, моя неудача после того, как не созерцаю полный datetime.

0
ответ дан 24.11.2019, 07:57