Μια UDF η οποία μας επιστρέφει της εργάσιμες μέρες μεταξύ δύο ημερομηνιών.

Παρακάτω θέλω να σας παρουσιάσω μια UDF η οποία μας επιστρέφει τόν αριθμό τών εργασίμων ημερών μεταξύ δύο ημερομηνιών.

Βήμα 1.

Δημιουργία ενός πίνακα στον οποίο εισάγουμε της Επίσημες αργίες όχι (Σάββατα-Κυριακές)

CREATE TABLE Public_Holidays
 (
         pubHoliday datetime NOT NULL
 )

go

insert into Public_Holidays values('2006-10-28')

insert into Public_Holidays values('2006-12-25') 

κ.λ.π.

Βήμα 2

Δημιουργία της UDF

CREATE FUNCTION fn_Wrk_days_Between (@FromDay datetime, @UntilDay datetime)
RETURNS int
AS
BEGIN
 
declare @day1 datetime,@day2 datetime,@tmpday datetime,@day int,@count int,@polaplasiastis int

/*
 Έλεγχος άν η ημερομηνία από είναι μεγαλύτερη από την ημερομηνία έως
 Αν η ημερομηνία από είναι μικρότερη από την έως περνάμε ανάποδα της παραμέτρους
 και δηλώνουμε τον πολλαπλασιαστή μέ -1 έτσι ώστε να μας επιστραφούν ή ημέρες εργασίας αρνητικά.
*/
if @FromDay < @UntilDay
 Begin
        set @day1 = CONVERT(datetime ,(CONVERT(char(10),@FromDay,102)),102 )
        set @day2 = CONVERT(datetime ,(CONVERT(char(10),@UntilDay,102)),102 )
        set @polaplasiastis=1
 End
Else
 Begin
        set @day2 = CONVERT(datetime ,(CONVERT(char(10),@FromDay,102)),102 )
        set @day1 = CONVERT(datetime ,(CONVERT(char(10),@UntilDay,102)),102 )
        set @polaplasiastis=-1
 End

set @tmpday = @day1
set @count = 0

/* Εκτέλεση μέχρι η προσωρινή ημερομηνία γίνει ίση μέ την day2 */
while ( datediff(dd,@tmpday,@day2) >= 0)
begin
Select @day = Datepart(dw,@tmpday)
        /* Αν δέν είναι Σάββατο και Κυριακή */
if (@day != 1 AND @day != 7)
        /* Αν δέν βρίσκεται στον πίνακα Αργιών */
 if not exists(Select * From Public_Holidays where pubHoliday= @tmpday)
        /* Αύξηση της @tmpday ανά μία(1) */
        Select @count = @count + 1
       
Select @tmpday = Dateadd(dd,1,@tmpday)
end

/* Επιστροφή ημερών εργασίας */

Return @count * @polaplasiastis
END

Βήμα 3

Επαλήθευση της UDF

select dbo.fn_Wrk_days_Between('2006-10-23','2006-10-29')

-----------
5

select dbo.fn_Wrk_days_Between('2006-12-25','2006-12-31')

-----------
4

Εύρεση εργασίμων ημερών όταν η ημερομηνία από είναι μεγαλύτερη από την έως

select dbo.fn_Wrk_days_Between('2006-12-25','2006-12-18')

-----------
-5

Όπως βλέπουμε πράγματι μας επιστρέφονται οι εργάσιμες μέρες στό εύρος πού ζητήσαμε.

Ελπίζω το παραπάνω κομμάτι κώδικα νά σας βοηθήσει .

 

Share


Έχουν δημοσιευτεί Πέμπτη, 21 Σεπτεμβρίου 2006 10:42 πμ από το μέλος imanos
Καταχώρηση στις κατηγορίες:

Σχόλια:

Χωρίς Σχόλια