Toon posts:

[SQL] Weekend filteren

Pagina: 1
Acties:

Onderwerpen


Anoniem: 376765

Topicstarter
Goedendag GoT!

Ik zit met een probleem dat me nu al een paar dagen bezig houd.
Ik heb volgens mij het hele internet al afgestruind naar antwoorden maar ik vind of niets of rare uitleg waar ik de ballen van begrijp. Daarom hoop ik dus dat jullie mij mischien kunnen helpen :D

Het probleem waar ik mee zit is dat ik tussen 2 datums de weekenden wil filteren. Dus een getal krijg van de hoeveelheid aan dagen weekend en dit in mijn formule kan verwerken. tot nu toe heb ik dit staan. Ik krijg hiermee netjes het totaal aantal bestede uren van het project waar het voor geld maar ik mis dus nog het "@AantalWeekend" onderdeel.

Ik zou erg dankbaar zijn als iemand mij een duwtje in de goede richting zou kunnen geven.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DECLARE @WerkdagStart datetime
DECLARE @WerkdagEind datetime
DECLARE @Werktijd int

SET @WerkdagStart = (SELECT CONVERT(VARCHAR,START_TIME,108) FROM PS_WERKTIJDTABEL)
SET @WerkdagEind = (SELECT CONVERT(VARCHAR,STOP_TIME,108) FROM PS_WERKTIJDTABEL)
SET @Werktijd = DATEDIFF(hour,@WerkdagStart, @WerkdagEind)

/*
Dit is de formule
select @EersteDag + @LaatsteDag + @Werktijd * (@AantalDagen - 2) - (@AantalWeekend * @Werktijd)
*/

/* dit de uitwerking*/

SELECT (DATETIMEDIFF((SELECT CONVERT(VARCHAR,A.DATUMTIJD_AANGEMAAKT,108))
,(SELECT CONVERT(VARCHAR,B.STOP_TIME,108))) / 60) 
+ (DATETIMEDIFF((SELECT CONVERT(VARCHAR,A.DATUMTIJD_EIND,108)), 
(SELECT CONVERT(VARCHAR,B.START_TIME,108))) / 60) 
+ @Werktijd * ( DATEDIFF(A.DATUMTIJD_AANGEMAAKT,A.DATUMTIJD_EIND) - 2) 
- (@AantalWeekend * @Werktijd)
FROM PS_HOOFDTABEL A, PS_WERKTIJDTABEL B

  • RobIII
  • Registratie: December 2001
  • Laatst online: 00:48

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Euh, leuk, maar ik mis je eigen inzet (zoals beschreven in onze Quickstart). Ik zie wel een query, maar geen poging tot het oplossen van je daadwerkelijke probleem. Dit komt nogal neer op een scriptrequest danwel Kan iemand even...? en daar doen we hier niet aan.

Ik zou graag een edit van je topicstart zien (Gebruik de edit knop ( http://tweakimg.net/g/forum/images/icons/edit.gif ) daarvoor) waarin je in ieder geval even laat zien wat je zelf al hebt geprobeerd om tot een oplossing te komen om @AantalWeekend te berekenen evenals wat je al hebt gezocht, gevonden, wat er niet werkt(e) en waarom je denkt dat 't niet werkt ;)

Begrijp me niet verkeerd, het is niet dat we niet willen helpen, maar op GoT verwachten we wel wat meer eigen inzet. Je hebt je query verder (klaarblijkelijk) al op orde, maar het posten van wat je wél hebt wat verder eigenlijk niet relevant is voor het eigenlijke probleem is dan dus niet nodig. Het ziet er wel "eigen inzetterig" uit, maar verbloemt het feit niet dat ik nergens in de topicstart de relevante inzet terug zie ;)

Een duw in de juiste richting: bereken (abs(verschil_in_dagen(datum1, datum2)) / 7) * 2 en je hebt al een heel aardige benadering (let wel: afhankelijk van de datum1/2 variabelen kan er een aantal dagen verschil inzitten; je zult dus iets meer werk moeten verzetten om het exacte aantal dagen te berekenen ;) ) I.c.m. deze functies moet je dan een heel eind komen.

[Voor 32% gewijzigd door RobIII op 08-06-2011 14:42]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Anoniem: 376765

Topicstarter
Sorry, maar ik ben er op dit moment druk mee bezig... ik hoopte alleen op mischien iemand die eerder ook met dit probleem heeft gezeten, zich een website herrinerd waar mischien het antwoord staat of dat er mischien een functie is die hier mee helpt...

Ook snap ik niet waar je het idee van afleid dat ik kant en klare meuk wil om er maar even bij in te pompen...
Ik zocht alleen een duwtje in de goede richting.

  • RobIII
  • Registratie: December 2001
  • Laatst online: 00:48

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Anoniem: 376765 schreef op woensdag 08 juni 2011 @ 14:23:
Ook snap ik niet waar je het idee van afleid dat ik kant en klare meuk wil om er maar even bij in te pompen...
Daar vraag je, min-of-meer, letterlijk om ;)
Anoniem: 376765 schreef op woensdag 08 juni 2011 @ 13:35:
Het probleem waar ik mee zit is dat ik tussen 2 datums de weekenden wil filteren. Dus een getal krijg van de hoeveelheid aan dagen weekend en dit in mijn formule kan verwerken. tot nu toe heb ik dit (niet relevante overige stuk sql red.) staan.
Anoniem: 376765 schreef op woensdag 08 juni 2011 @ 14:23:
Ik zocht alleen een duwtje in de goede richting.
Dat heb je gehad ;) Nu is 't aan jou ;)

[Voor 32% gewijzigd door RobIII op 08-06-2011 14:41]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Moraelyn
  • Registratie: Januari 2007
  • Laatst online: 30-01 20:43
Met datepart kun je de nummer van de weekdag bepalen. Dan weet je of het over het weekend heen gaat en kun je die dagen er aftrekken.

Anoniem: 376765

Topicstarter
Bedankt Moraelyn! ik had er niet aan gedacht :P. heb er wel 20 keer overheen gelezen op msdn maar zag het niet staan ofzo
ik ga hier even mee bezig en dan post ik hier wel weer wat eruit is gekomen

@Rob: Kijk hier was ik op uit en geen kant-en-klare stukken code. bedankt trouwens voor de stekende opmerkingen. :)

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
let even op....het dagnummer is afhankelijk van de locale settings. Uit mijn hoofd is in Amerika de eerste weekdag een zondag, maar in Nederland is maandag de eerste dag van de week. Een ranzige doch foolproof oplossing is zorgen dat je de dag van de week als Engels woord gebruikt en dan checkt of het eerste karakter een s of S is (saturday, sunday).

Zie voor een soortgelijke discussie hier

[Voor 14% gewijzigd door KabouterSuper op 08-06-2011 15:05. Reden: link toegevoegd]


  • RobIII
  • Registratie: December 2001
  • Laatst online: 00:48

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

KabouterSuper schreef op woensdag 08 juni 2011 @ 15:01:
Een ranzige doch foolproof oplossing is zorgen dat je de dag van de week als Engels woord gebruikt en dan checkt of het eerste karakter een s of S is (saturday, sunday).
Nog fool-proofer en niet-ranzig is gewoon @@DATEFIRST gebruiken; daar is 'ie voor ;) Afgaande op de SQL in de topicstart lijkt 't me MSSQL, geen Oracle. Maar ik kan me vergissen :)

[Voor 11% gewijzigd door RobIII op 08-06-2011 15:12]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Anoniem: 376765

Topicstarter
Ik ben het nu aan het programmeren in Microsoft SQL Server puur omdat dit makkelijker werkt maar het moet straks geport worden naar Oracle.

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 01-06 10:33
Dat lijkt me een vreemde manier van werken. Stel, even puur hypothetisch, dat Oracle voor jouw wens gewoon al wel een bestaande functie heeft? Dan ben je voor de kat zijn ehhh....staart bezig :)

Whatever


Anoniem: 376765

Topicstarter
Oracle heeft hier geen specifieke functie voor. Dat had ik al wel nagekeken :) Wel zijn er voor de genoemde functies in deze draad wel vergelijkbare functies in oracle zoals DateDiff is in Oracle %DateTimeDiff etc.
Dan ben je voor de kat zijn ehhh....staart bezig :)
Volgens mij is het Voor de kat zijn viool.
Tenminste dat is wat ik 3 jaar lang van mijn oude economie leraar heb gehoord :P

En kijk aan de oplossing!
Nu tel hij de dagen tussen 2 datums en filtert de weekend dagen eruit.
Bedankt voor de hulp!

SQL:
1
2
3
4
5
6
select (DATEDIFF(dd,DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND) + 1) 
-(DATEDIFF(wk, DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND) * 2) 
-(CASE WHEN DATENAME(dw, DATUMTIJD_AANGEMAAKT) = 'Sunday' THEN 1 ELSE 0 END) 
-(CASE WHEN DATENAME(dw, DATUMTIJD_EIND) = 'Saturday' THEN 1 ELSE 0 END) , 
DATEDIFF(DAY,DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND) - DATEDIFF(DAY,DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND)/7*2
FROM PS_HOOFDTABEL

[Voor 40% gewijzigd door Anoniem: 376765 op 08-06-2011 16:08]


  • RobIII
  • Registratie: December 2001
  • Laatst online: 00:48

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Nee :P Het werkt (nu, misschien, toevallig :P ) weliswaar, maar zodra je uitrolt naar een productieserver of weet-ik-het met een andere locale of afwijkende instellingen waardoor "Saturday" opeens "Zaterdag" blijkt te zijn ga je op je bek ;)

[Voor 9% gewijzigd door RobIII op 08-06-2011 16:30]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Oplossing? Oh, je bedoelt "ranzige hack"? :)

"Any sufficiently advanced technology is indistinguishable from magic."


Anoniem: 376765

Topicstarter
Dan doen we het toch zo. :P

SQL:
1
2
3
4
5
6
7
SET DATEFIRST 7;
SELECT (DATEDIFF(dd,DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND) + 1)  
-(DATEDIFF(wk, DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND) * 2)  
-(CASE WHEN DATEPART(dw, DATUMTIJD_AANGEMAAKT) = 7 THEN 1 ELSE 0 END)  
-(CASE WHEN DATENPART(dw, DATUMTIJD_EIND) = 1 THEN 1 ELSE 0 END) ,  
DATEDIFF(DAY,DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND) - DATEDIFF(DAY,DATUMTIJD_AANGEMAAKT, DATUMTIJD_EIND)/7*2 
FROM PS_HOOFDTABEL


Tevreden?

  • RobIII
  • Registratie: December 2001
  • Laatst online: 00:48

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Nope :P
Allereerst zal DATEPART (maar hier kan ik me in vergissen) integers teruggeven; dus '1' en '7' zouden 1 resp. 7 moeten zijn. En ten tweede kun je, als je hier even leest, concluderen dat zaterdag/zondag niet altijd 1 en 7 zijn, dat kan net zo goed 1 en 2 zijn, bij-wijze-van, afhankelijk van de instellingen van de server. Correctie: ik zie nu regel 1 van je SQL statement pas :P
Tot slot: ik heb 't niet tot in den treure geanalyseerd uit m'n blote bol, maar mijn gut-feel zegt me dat je waarschijnlijk wat edge-cases mist met begin/eind die wel/niet in een weekend vallen of waarbij ze allebei wel/niet in 't weekend vallen of weet-ik-het.

[Voor 22% gewijzigd door RobIII op 08-06-2011 16:56]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Anoniem: 376765

Topicstarter
Het werkt op de server waar ik op werk en na een beetje navragen weet ik zeker dat alle servers bij ons netjes in het engels staan. Dus... het functioneert en het zal wel een tijdje blijven functioneren. Ik blij, chef blij, iedereen blij :D

En nu ga ik zo welverdiend van een koud pilsje en een paar aflevering van HIMYM genieten.
Jullie ook een fijne avond verder :D

[Voor 21% gewijzigd door Anoniem: 376765 op 08-06-2011 16:59]


  • Precision
  • Registratie: November 2006
  • Laatst online: 17-01-2020
Spelen feestdagen geen rol?

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee