Получить номер понедельника в ранжированном MySQL - PullRequest
0 голосов
/ 07 февраля 2019

Получите число понедельника в MySQL ранжированного, я запускаю этот код, но он дает мне результат 0:

select count(*) from tarif where weekday(`end_tarif`<= '2019-02-21'AND `start_tarif`>='2019-02-05') = 0;

моя таблица:

CREATE TABLE `tarif` (                  
    `tarif_id` int(11) NOT NULL AUTO_INCREMENT,
    `start_tarif` date NOT NULL,
    `end_tarif` date NOT NULL,
    `day_tarif` varchar(50) NOT NULL,
    PRIMARY KEY (`tarif_id`)
);

INSERT INTO `tarif` VALUES (1, '2019-02-01', '2019-02-10', '10'),
    (2, '2019-02-11', '2019-02-20', '20'),
    (3, '2019-02-21', '2019-02-28', '10'),
    (4, '2019-03-01', '2019-02-10', '15');

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете использовать решение, используя таблицу календаря.Таким образом, вы можете использовать решение, подобное следующему:

1.создать таблицу с календарными данными

-- create the table "calendar"
CREATE TABLE `calendar` (
  `dateValue` DATE
);

-- insert the days to the table "calendar"
INSERT INTO calendar
SELECT adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) gen_date from
    (select 0 t0 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) t0,
    (select 0 t1 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) t1,
    (select 0 t2 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) t2,
    (select 0 t3 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) t3,
    (select 0 t4 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) t4
HAVING gen_date BETWEEN '2019-01-01' AND '2019-12-31'

Вы можете найти скрипт для генерации календарных данных в StackOverflow :
Как заполнитьтаблица с диапазоном дат?

2.создайте таблицу с вашими данными (с понедельничным тарифом)

-- create the table "tarif"
CREATE TABLE tarif (
  tarif_id INT(11) NOT NULL AUTO_INCREMENT,
  start_tarif DATE NOT NULL,
  end_tarif DATE NOT NULL,
  day_tarif VARCHAR(50) NOT NULL,
  monday_tarif VARCHAR(50) NOT NULL,
  PRIMARY KEY (tarif_id)
);

-- insert the tarif information
INSERT INTO tarif VALUES 
  (1, '2019-02-01', '2019-02-10', '10', '5'),
  (2, '2019-02-11', '2019-02-20', '20', '5'),
  (3, '2019-02-21', '2019-02-28', '10', '5'),
  (4, '2019-03-01', '2019-02-10', '15', '5');

Примечание: Чтобы создать полезный пример, я добавил столбец monday_tarif и вставил значение 5 в каждыйдиапазон дат.

3.получить результат

Теперь вы можете получить все дни нужного вам диапазона (между 2019-02-05 и 2019-02-21) из таблицы календаря.С помощью LEFT JOIN вы добавляете свою таблицу тарифов ко всем дням диапазона дат.

С помощью CASE WHEN и условия DAYOFWEEK = 2 или DAYNAME = 'Monday' вы можете проверить, является ли текущая дата понедельником или нет, чтобы получить правильное значение тарифа дня.

SELECT SUM(CASE WHEN DAYOFWEEK(cal.dateValue) = 2 THEN tarif.monday_tarif ELSE tarif.day_tarif END) AS sumWithMondayTarif 
FROM calendar cal
    LEFT JOIN tarif ON cal.dateValue BETWEEN start_tarif AND end_tarif
WHERE cal.dateValue BETWEEN '2019-02-05' AND '2019-02-21';

Вы также можете использовать SELECT с дополнительным выбором календаря:

SELECT SUM(CASE WHEN DAYOFWEEK(cal.dateValue) = 2 THEN tarif.monday_tarif ELSE tarif.day_tarif END) AS sumWithMondayTarif FROM (
  SELECT adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) dateValue FROM
    (select 0 t0 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) t0,
    (select 0 t1 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) t1,
    (select 0 t2 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) t2,
    (select 0 t3 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) t3,
    (select 0 t4 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) t4
  HAVING dateValue BETWEEN '2019-02-05' AND '2019-02-21'
) cal LEFT JOIN tarif ON cal.dateValue BETWEEN start_tarif AND end_tarif

демо на dbfiddle.uk

0 голосов
/ 07 февраля 2019

Ниже упомянутый запрос для sundays кол.Вы можете изменить его согласно вашему требованию

select ROUND((
      (unix_timestamp(`end_tarif`) - unix_timestamp(`start_tarif`) )/(24*60*60)
      -7+WEEKDAY(`start_tarif`)-WEEKDAY(`end_tarif`)
    )/7)

 + if(WEEKDAY(`start_tarif`) <= 6, 1, 0)
 + if(WEEKDAY(`end_tarif`) >= 6, 1, 0) as Sunday
from tarif 
where  `end_tarif`<= '2019-02-21' AND `start_tarif`>='2019-02-05'  ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...