Παρακάτω θέλω να σας παρουσιάσω μια 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
Όπως βλέπουμε πράγματι μας επιστρέφονται οι εργάσιμες μέρες στό εύρος πού ζητήσαμε.
Ελπίζω το παραπάνω κομμάτι κώδικα νά σας βοηθήσει .