2016-04-06 27 views
1

Son zamanlarda bir izin yönetim sistemi geliştirmekteyim. Bu uygulamada bir ay bilge çalışan izin bildirimi gibi bir rapora ihtiyacım var. Belirli bir tarih aralığında başlangıç ​​tarihi ile bitiş tarihi arasındaki tüm bilgileri nasıl alabilirim?

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
Şimdi ben akıllıca ay bu raporu alabilirsiniz bir rapor gerekir:

İşte benim örnek masa. Böyle, sadece Mart ayı veri gerek varsayalım:

<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>

Bunu nasıl elde edebilirsiniz - PL/SQL veya herhangi bir SQL dilinin tarafından?

cevap

1

için

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

:

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' 

Böyle kodlanmış tarihleri ​​değiştirmek için bir bağlama değişkeni kullanabilirsiniz:

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 

sonra zaman bileşenlerini varsa: Gerekli için bir parametre kullanabilirsiniz

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

Çalışır. sen benim günümü kurtardın. Çok teşekkür ederim. –

+0

Bir bağlama değişkeni nedir –

+0

@sql_dummy A [hızlı arama] (https://www.google.com/?gws_rd = ssl # q = oracle + bind + variable) bu quesitona birçok cevap verebilirdi. – MT0

0

koşul Bu SQL Server içindir

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

(burada parameter_date gerekli ay TARİH değil, bir VARCHAR2 gibidir)? – MT0

0

olmalıdır tarihlerin zaman bileşeni sonra 00:00:00 ayarlanmış olduğunu varsayarsak Oracle

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

ORA-00904: "MONTH": geçersiz tanımlayıcı ile ilgili bu hatalar. – MT0

+1

Kişi, Mart ayının son haftasından 6 hafta boyunca izinliyse ve ne "start_date" ne de "end_date" Nisan ayında ise ne olacak? (veya o ayda yalnızca bir tarih varsa) – MT0

0

biçimi 'YYYYAA' in (Mart 2016 için: '201603') ay

sonra nerede-fıkra şöyle olacaktır:

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

Bir izin bir aydan daha uzunsa, parametrenin başlangıç ​​ve bitiş tarihleri ​​arasında olup olmadığını da kontrol etmeniz gerekir.

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

ayın ilk ve son gününü görüntülemek için FIRST_DAY ve LAST_DAY fonksiyonu ile kombine bir VAKA deyimi kullanabilirsiniz raporda doğru tarihi görüntüler. kişi Nisan ayının ilk haftasında Şubat ayının son haftasında itibaren 6 hafta boyunca izinli olup olmadığını ne

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 
İlgili konular