Multi SQL выбора оператора - PullRequest
       10

Multi SQL выбора оператора

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

У меня есть таблица такого типа:

| name    |  salary |  day  |  month   |
| james   |  200.00 |    2  | january  |
| marie   |  400.00 |    4  | january  |
| jimmy   |  300.00 |    7  | january  |
| Fredd   |  700.00 |    3  | february |
| rosieli |  500.00 |    5  | february |
| rosela  |  800.00 |    6  | february |

, если имя таблицы 'db_table', как мне написать запрос выбора sql для выбора записей с 4 января по 5 февраля.что-то вроде:

select * from db_table between day='4',month='january' and day='5' and month='february'";

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

| name    |  salary |  day  |  month   | 
| marie   |  400.00 |    4  | january  |
| jimmy   |  300.00 |    7  | january  |
| Fredd   |  700.00 |    3  | february |
| rosieli |  500.00 |    5  | february |

спасибо

Ответы [ 4 ]

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

Вы действительно должны сделать это, используя даты.

select t.*
from t
where str_to_date(concat_ws(2020, month, day), '%Y %M %d') between '2020-01-04' and '2020-02-05';

Когда это возможно, сравнение дат должно быть сделано с использованием дат.

Я использовал 2020, потому что это високосный год, поэтомуон будет обрабатываться 29 февраля.

После того, как вы решите это, вы должны исправить свою модель данных, чтобы она содержала фактическую дату, а не комбинацию месяц / день.

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

как написать запрос выбора SQL для выбора записей с 4 января по 5 февраля.

select  *
from    db_table
where   (month = 'january' and 4 <= cast(day as int)) or
        (month = 'february' and cast(day as int) <= 5)

Обратите внимание, что дизайн таблицы с отдельными столбцами месяца и дня усложняет запрос.Это будет еще сложнее на границе года.Лучший дизайн будет использовать родной тип столбца datetime вашей базы данных.Тогда вы можете запросить как:

select  *
from    db_table
where   dt_col between '2019-01-04' and '2019-02-05'
0 голосов
/ 09 февраля 2019

Вам нужно будет сделать число числом, но это оно:

SELECT *
FROM db_table
WHERE (day >= 4 and month = 'January')
   OR (day <= 5 and month = 'February')

Например, с января по апрель:

SELECT *
FROM db_table
WHERE (day >= 4 and month = 'January')
   OR (day <= 5 and month = 'April')
   OR month IN ('February','March')
0 голосов
/ 09 февраля 2019

Вы должны создать сопоставимую строку из month и day для использования в операторе between:

select * from db_table where 
concat(case month 
         when 'january' then '01'
         when 'february' then '02'
         ........................
         when 'december' then '12'
       end, case when day < 10 then '0' else '' end, day) between '0104' and '0205'

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

...