2016-04-06 9 views
1

Kürzlich habe ich ein Urlaubsmanagement-System entwickelt. In dieser Anwendung brauche ich einen Bericht wie in einem Monat weise Mitarbeiter Urlaubserklärung.Wie erhalten Sie alle Informationen über das Startdatum bis zum Enddatum innerhalb eines bestimmten Zeitraums?

hier ist also meine Beispieltabelle:

Employee Id \t application Date \t Start Date \t End Date 
 
20130002 \t 14-Mar-2016 \t  16-Mar-2016 \t 17-Mar-2016 
 
20130012 \t 15-Mar-2016 \t  29-Mar-2016 \t 2-Apr-2016 
 
20130003 \t 14-Mar-2016 \t  15-Mar-2016 \t 16-Mar-2016 
 
20130005 \t 10-Mar-2016 \t  24-Mar-2016 \t 24-Mar-2016 
 
20130002 \t 10-Mar-2016 \t  20-Mar-2016 \t 25-Mar-2016 
 
20130006 \t 13-Mar-2016 \t  8-Mar-2016 \t 17-Mar-2016 
 
20130001 \t 14-Mar-2016 \t  4-Apr-2016 \t 24-Apr-2016 
 
20130003 \t 15-Mar-2016 \t  16-May-2016 \t 18-May-2016 
 
20130011 \t 10-Mar-2016 \t  7-Jun-2016 \t 7-Jun-2016

Jetzt brauche ich einen Bericht, in dem ich diesen Bericht weise Monat bekommen können. Angenommen, ich nur März Daten benötigen, wie folgt aus:

<pre> 
 
Employee Id \t application Date \t Start Date \t End Date 
 
20130002 \t 14-Mar-2016 \t 16-Mar-2016 \t 17-Mar-2016 
 
20130012 \t 15-Mar-2016 \t  29-Mar-2016 \t 31-Mar-2016 
 
20130003 \t 14-Mar-2016 \t  15-Mar-2016 \t 16-Mar-2016 
 
20130005 \t 10-Mar-2016 \t  24-Mar-2016 \t 24-Mar-2016 
 
20130002 \t 10-Mar-2016 \t  20-Mar-2016 \t 25-Mar-2016 
 
20130006 \t 13-Mar-2016 \t  8-Mar-2016 \t 17-Mar-2016 
 
</pre>

Wie kann ich dies erreichen - von PL/SQL oder jede SQL-Sprache?

Antwort

1

Unter der Annahme, dass die Zeitkomponente der Daten zu 00:00:00 dann festgelegt ist:

SELECT EmployeeId, 
     application_date, 
     GREATEST(start_date, DATE '2016-03-01') AS start_date, 
     LEAST(end_date, DATE '2016-03-31') AS end_date 
FROM table_name 
WHERE Start_date <= DATE '2016-03-31' 
AND end_date >= DATE '2016-03-01' 

Sie können einen Bind-Variable verwenden, um die hartcodierte Daten wie diese zu ersetzen:

SELECT EmployeeId, 
     application_date, 
     GREATEST(start_date, :month_start) AS start_date, 
     LEAST(end_date, LAST_DAY(:month_start)) AS end_date 
FROM table_name 
WHERE Start_date <= LAST_DAY(:month_start) 
AND end_date >= :month_start 

Wenn Sie Zeit Komponenten haben dann:

SELECT EmployeeId, 
     application_date, 
     GREATEST(start_date, :month_start) AS start_date, 
     LEAST(end_date, :month_start + INTERVAL '1' MONTH - INTERVAL '1' SECOND) 
     AS end_date 
FROM table_name 
WHERE Start_date < :month_start + INTERVAL '1' MONTH 
AND end_date >= :month_start 
+0

Es funktioniert. Du sparst meinen Tag. Vielen Dank. –

+0

Was ist eine Bindungsvariable? –

+0

@sql_dummy A [Schnellsuche] (https://www.google.com/?hl=de).gws_rd = ssl # q = oracle + bind + variable) würde viele Antworten auf diese Frage liefern. – MT0

0

sollte die Bedingung

sein
WHERE StartDate>='01-Mar-2016' and EndDate <'01-Apr-2016' 
+1

Was ist, wenn die Person auf Urlaub für 6 Wochen von der letzten Februarwoche zur ersten April-Woche ist? – MT0

0

Diese für SQL Server ist

SELECT * 
FROM Leaves 
WHERE MONTH(StartDate) <= 4 and Month(EndDate) >= 4 

Für Oracle

SELECT * 
FROM Leaves 
WHERE EXTRACT(month FROM StartDate) <= 4 and EXTRACT(month FROM EndDate) >= 4 
+0

Dieser Fehler mit 'ORA-00904:" MONTH ": ungültiger Bezeichner'. – MT0

+1

Was ist, wenn die Person 6 Wochen von der letzten Märzwoche bis zur ersten Maiwoche im Urlaub ist und weder 'start_date' noch' end_date' im April sind? (oder wenn nur ein Datum in diesem Monat ist) – MT0

0

Sie einen Parameter für den erforderlichen verwenden könnten Monat im Format 'YYYYMM' (für den Monat März 2016: '201603')

dann wäre die where-Klausel:

where parameter = to_char(start_date,'yyyymm') 
or parameter = to_char(end_date,'yyyymm') 

Wenn ein Urlaub länger als einen Monat dauern kann, müssen Sie auch prüfen, ob der Parameter zwischen Start- und Enddatum liegt.

.. 
or parameter between to_char(start_date,'yyyymm') and to_char(end_date,'yyyymm') 

das richtige Datum in dem Bericht angezeigt werden Sie eine CASE-Anweisung in Kombination mit der first_day und last_day Funktion den ersten anzuzeigen und den letzten Tag des Monats nutzen können. (hier die parameter_date ist der erforderliche Monat als DATE, keine VARCHAR2)

CASE 
    WHEN start_date < first_day(parameter_date) THEN first_day(parameter_date) 
    ELSE start_date 
END as start_Date, 
CASE 
    WHEN end_date > last_day(parameter_date) THEN last_day(parameter_date) 
    ELSE end_date 
END as end_Date 
Verwandte Themen