Archief - SQL functie

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

kney

Legacy Member
Ik ben bezig aan een SQL functie die het aantal werkdagen optelt bij een datum en deze berekende datum teruggeeft.

Deze functie moet wel rekening houden met alle feestdagen. Maar ik weet niet hoe ik dit kan implementeren.

Code:
CREATE FUNCTION Optellen (@StartDate DATETIME, @Number INT) 
RETURNS DATETIME AS
BEGIN
       RETURN DATEADD(DAY, @Number, @StartDate)
END

kney

Legacy Member
Oplossing :)

Code:
CREATE FUNCTION Optellen (@StartDate DATETIME, @Number INT) 
RETURNS DATETIME AS
BEGIN

DECLARE @Counter INTEGER

SET @Counter = 1

WHILE @Counter <= @Number
BEGIN
      SET @StartDate = DATEADD(DAY, 1, @StartDate)
      IF (DATEPART(dw, @StartDate) != 1) AND (DATEPART(dw, @StartDate) != 7)
      BEGIN
            DECLARE @Holidays TABLE(holidayDate DATETIME)
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-01-01 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-03-31 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-04-01 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-05-01 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-05-09 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-05-19 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-05-20 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-07-21 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-08-15 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-11-01 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-11-11 00:00:00')
            INSERT INTO @Holidays (holidayDate) VALUES ('2013-12-25 00:00:00')
            IF (NOT EXISTS (SELECT * FROM @Holidays h WHERE h.holidayDate = @StartDate))
            BEGIN
                  SET @Counter = @Counter +1
            END
      END
END

RETURN @StartDate

END

woony

Legacy Member
en je gaat iedere keer die table creëren? Steek die één keer in uw databank voor jaren ver..

Moto

Legacy Member
De vraag is niet HOE doet ge dat in Sql maar eerder WAAROM doet ge dat in Sql

Tyfius

Legacy Member
Omdat ge dat wilt gebruiken in een stored procedure die door verschillende applicaties geschreven in verschillende talen gebruikt dient te worden? Er zijn 101 redenen waarom dat hij zoiets in SQL zou willen doen...

Soit, woony heeft een punt. Voorzie een aparte tabel waar die data in komt te staan die je dan om de zoveel jaar eens moet bijvullen.

crazyman2

Legacy Member
Je mag wel niet vergeten dat een feestdag ook op een zaterdag of zondag kan vallen. In de meeste bedrijven wordt die dan de opvolgende maandag opgenomen.

Daarnaast kan je ook een extra veld voorzien in de tabel omdat de meesta data onafhankelijk van externe factoren zijn. Zo zijn 25 dec en 1 jan jaar/dag onafhankelijk. Dat is op 10 jaar al snel een verschil van 75% ofzo dat je dan nog moet ingeven. Het zal wss wel database technisch zwaarder zijn (je zou een datepart moeten uitvoeren op die data). Geen idee exact hoe zwaar, dat zal van de query afhangen natuurlijk, en hoe vaak die draait.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan