2015-11-02 2 views
0

У меня проблема с использованием «group by» и «select-case-when» в SQL.sql group по сезону

У меня есть эта таблица: Продвижение (Название, CodProd, CodProdSimilar, StartDate, EndDate, Discount), и что мне нужно сделать: знать, в какие сезоны действует акция.

Например:

<table style="width:100%"> 
    <tr> 
    <td>Name</td> 
    <td>StartDate(dd/mm/yyyy)</td> 
    <td>EndDate(dd/mm/yyyy)</td> 
    <td>Season (southern hemisphere)</td> 
    </tr> 
    <tr> 
    <td>Prom1 </td> 
    <td>02/01/2015 </td> 
    <td>09/01/2015</td> 
    <td>Summer</td> 
    </tr> 
    <tr> 
    <td>Prom2 </td> 
    <td>02/01/2015 </td> 
    <td>09/04/2015</td> 
    <td>Summer</td> 
    </tr> 
    <tr> 
    <td>Prom2 </td> 
    <td>02/01/2015 </td> 
    <td>09/04/2015</td> 
    <td>Autumn</td> 
    </tr> 
</table> 

это легко решить, когда акция только один сезон, но я не могу это сделать еще в случае Prom2.

Мой код:

select 
    Name, StartDate, EndDate, 
    CASE 
     WHEN EXTRACT(MONTH from StartDate) < 3 THEN 'Summer' 
     WHEN EXTRACT(MONTH from StartDate) = 3 THEN 
      CASE 
       WHEN EXTRACT(DAY from StartDate) <= 20 THEN 'Summer' 
       ELSE 'Autumn' 
      END 
     WHEN EXTRACT(MONTH from StartDate) < 6 THEN 'Autumn' 
     WHEN EXTRACT(MONTH from StartDate) = 6 THEN 
      CASE 
       WHEN EXTRACT(DAY from StartDate) <= 20 THEN 'Autumn' 
       ELSE 'Winter' 
      END 
     WHEN EXTRACT(MONTH from StartDate) < 9 THEN 'Winter' 
     WHEN EXTRACT(MONTH from StartDate) = 9 THEN 
      CASE 
       WHEN EXTRACT(DAY from StartDate) <= 20 THEN 'Winter' 
       ELSE 'Spring' 
      END 
     WHEN EXTRACT(MONTH from StartDate)< 12 THEN 'Spring' 
     WHEN EXTRACT(MONTH from StartDate) = 12 THEN 
      CASE 
       WHEN EXTRACT(DAY from StartDate) <= 20 THEN 'Spring' 
       ELSE 'Summer' 
      END 
    END as season 
from 
    promotion 

Любая идея?

Большое спасибо за ваше время!

+1

Какой РСУБД это? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+0

Oracle Database 11g Release 2 для Microsoft Windows (x64) –

ответ

0

Для вашего случая, вы можете конвертировать столбцы в строку, используя месяц & Дата, которую мы можем определить, как вы упомянули.

select Name,StartDate,EndDate, 
case 
      when to_char(StartDate,'MMDD') between '0321' and '0620' then 'spring' 
      when to_char(StartDate,'MMDD') between '0621' and '0922' then 'summer' 
      when to_char(StartDate,'MMDD') between '0923' and '1220' then 'fall' 
      else              'winter' 
     end as season 
FROM promotion 

Пожалуйста, обратитесь это, вы получите больше информации

https://wiki.postgresql.org/wiki/Date_and_Time_dimensions

PostgreSQL group by season (northern and southern hemisphere)