Отображение всех дат в заданном месяце и году в процедуре выбора firebird

Я делаю программу для учета времени и посещаемости.

У меня есть таблица с этими полями

  ATTEND_PK INTEGER NOT NULL,
  EMP VARCHAR,
  ATTEND_DATETIME TIMESTAMP,
  USER_PK SMALLINT,
  ATTEND_UPDATETIME TIMESTAMP);

вот пример данных

| ATTEND_PK  |     EMP       |      ATTEND_DATETIME       |
|     1      |    john       |     1/23/2018 7:00:00      |
|     2      |    john       |     1/23/2018 12:00:00     |
|     3      |    john       |     1/23/2018 13:00:00     |
|     4      |    john       |     1/23/2018 16:00:00     |
|     5      |    john       |     1/24/2018 7:30:00      |
|     6      |    john       |     1/24/2018 11:50:00     |
|     7      |    john       |     1/24/2018 13:20:00     |
|     8      |    john       |     1/24/2018 16:40:00     |

и мой желаемый результат таков

 |   EMP    |    DATE     |    AM_IN   |   AM_OUT   |   AM_IN  |   AM_OUT   |
 |   john   |  1/1/2018   |     NULL   |    NULL    |   NULL   |    NULL    | 
 |   john   |  1/2/2018   |     NULL   |    NULL    |   NULL   |    NULL    |
 |   ....   |   .....     |     NULL   |    NULL    |   NULL   |    NULL    |
 |   john   |  1/23/2018  |   7:00:00  |  12:00:00  |  1:00:00 |   4:00:00  |
 |   john   |  1/23/2018  |   7:30:00  |  11:50:00  |  1:20:00 |   4:40:00  |
 |   ....   |   .....     |     NULL   |    NULL    |   NULL   |    NULL    |
 |   john   |  1/31/2018  |     NULL   |    NULL    |   NULL   |    NULL    |

формат времени моего желаемого вывода и мои данные отличаются и отображают полные даты данного месяца и года


person Don Juan    schedule 22.02.2018    source источник
comment
Вы уверены, что в день будет только 2 входа и выхода?   -  person Sivaprasath    schedule 22.02.2018
comment
Stack Overflow — это не служба написания кода, вы не можете просто выложить здесь свои требования и ожидать, что мы решим их за вас. Пожалуйста, покажите, что вы пробовали и где вы застряли.   -  person Mark Rotteveel    schedule 22.02.2018
comment
Отчет о перекрестных таблицах лучше делать с помощью клиентского приложения, использующего один из многих доступных механизмов создания отчетов. Делать это внутри SQL-серверов — неудачный выбор. stackoverflow.com/questions/48262968/ Конечно, это не ТОЧНО кросс-таблица, но очень похожая вещь, так как вы не знаете, сколько столбцов вы был бы, @Sivaprasath отлично справился с этим.   -  person Arioch 'The    schedule 22.02.2018
comment
Возможный дубликат кросс-таблицы : подсчет одной и той же строки в поле и отображение ее как имени поля   -  person Arioch 'The    schedule 22.02.2018


Ответы (1)


Вы можете решить эту проблему с помощью выбираемой хранимой процедуры.

Для начала, вот процедура, которая перечисляет дни в месяце:

create procedure days_in_month (y int, m int)
returns (d date) as
begin
  d = cast(y || '-' || m || '-01' as date);
  while (extract(month from d) = m) do
  begin
    suspend;
    d = d + 1;
  end
end

Можно так назвать

select * from days_in_month (2018, 1)

и вернет (в данном случае) 31 строку со всеми датами дней в январе 2018 года.

Определение таблицы в тексте вашего вопроса является всего лишь псевдокодом, поэтому я не могу использовать его для предоставления рабочего образца. Но с реальной таблицей данных вы можете либо использовать (левый) синтаксис соединения (с описанной выше процедурой days_in_month слева и физической таблицей с другой стороны) и использовать встроенные функции Firebirds extract и case, или вы можете поместите все это в хранимую процедуру, которая может позволить программировать более императивным способом.

person KarloX    schedule 26.02.2018
comment
есть ли способ отобразить субботу и воскресенье в этой процедуре? - person Don Juan; 24.03.2018
comment
Вы можете написать extract(weekday of d) и добавить эти значения (0 = воскресенье, 6 = суббота) в другой столбец возврата. - person KarloX; 26.03.2018