Hoi!
Ik heb een probleem waar ik al een hele tijd mee bezig ben, maar ik kom er niet uit. Ik heb een tabel met een naam en een begin- en einddatum. De begin- en einddatum geven een geldigheid aan en deze overlappen niet per naam.
Wat ik vervolgens wil is een select statement maken die voor een bepaalde periode, gedefinieerd door een begindatum en een eind datum, selecteert welke records op in die periode geldig zijn. Maar als er meerdere geldig zijn, dan wil ik alleen de eerste hebben. En daar kom ik niet uit.
Ik heb de tabel vereenvoudigd naar dit:
Als ik nu als periode '2009-01-15' tot '2009-08-28' aangeef, dan wil ik dat record 2, 6 en 7 zichtbaar worden. Een NULL betekent dat er geen einde is van de geldigheid.
De query die ik momenteel heb is zo:
De function DATEINPERPERIOD ziet er zo uit:
De functie geeft dus een true of false terug als het record in de periode valt.
Het resultaat:
Hierbij wil ik dus ALLEEN het eerste "MARK" record zien, omdat dit het eerste geldige record is van die naam.
Dit is dus het resultaat dat ik zou willen hebben:
HOE doe ik dit? Ik heb van alles geprobeerd met MIN(begindatum) en GROUP BY's, maar niets dat enig resultaat oplevert.
Het liefst zou ik het willen oplossen zonder de originele query te herhalen. Ik moet dit namelijk in 20 vrij lange queries herhalen en deze zou ik liever niet allemaal verdubbelen door een subselect te doen.
Alvast hartelijk bedankt!
Ik heb een probleem waar ik al een hele tijd mee bezig ben, maar ik kom er niet uit. Ik heb een tabel met een naam en een begin- en einddatum. De begin- en einddatum geven een geldigheid aan en deze overlappen niet per naam.
Wat ik vervolgens wil is een select statement maken die voor een bepaalde periode, gedefinieerd door een begindatum en een eind datum, selecteert welke records op in die periode geldig zijn. Maar als er meerdere geldig zijn, dan wil ik alleen de eerste hebben. En daar kom ik niet uit.
Ik heb de tabel vereenvoudigd naar dit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
| CREATE TABLE AA_TEST ( NAAM VARCHAR(10), BEGINDATUM DATETIME, EINDDATUM DATETIME ) INSERT INTO AA_TEST VALUES ('MARK', '2009-01-01', '2009-02-28') --record 1 INSERT INTO AA_TEST VALUES ('MARK', '2009-03-01', '2009-04-30') --record 2 INSERT INTO AA_TEST VALUES ('MARK', '2009-05-01', '2009-06-30') --record 3 INSERT INTO AA_TEST VALUES ('MARK', '2009-07-01', '2009-08-31') --record 4 INSERT INTO AA_TEST VALUES ('MARK', '2009-09-01', '2009-12-31') --record 5 INSERT INTO AA_TEST VALUES ('HENK', '2007-01-01', NULL) --record 6 INSERT INTO AA_TEST VALUES ('KEES', '2008-01-01', '2015-12-31') --record 7 |
Als ik nu als periode '2009-01-15' tot '2009-08-28' aangeef, dan wil ik dat record 2, 6 en 7 zichtbaar worden. Een NULL betekent dat er geen einde is van de geldigheid.
De query die ik momenteel heb is zo:
SQL:
1
2
3
| select naam, begindatum, einddatum from aa_test where DATEINPERPERIOD('2009-01-15', '2009-08-28', begindatum, einddatum) = 1 order by begindatum |
De function DATEINPERPERIOD ziet er zo uit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| CREATE FUNCTION [DATEINPERPERIOD] ( @BEGINDATUM_PERIODE DATETIME, @EINDDATUM_PERIODE DATETIME, @BEGINDATUM_DIENSTREGELING DATETIME, @EINDDATUM_DIENSTREGELING DATETIME ) RETURNS BIT AS BEGIN DECLARE @RESULT BIT IF (((@BEGINDATUM_DIENSTREGELING >= @BEGINDATUM_PERIODE) AND (@BEGINDATUM_DIENSTREGELING < @EINDDATUM_PERIODE)) OR ((@BEGINDATUM_DIENSTREGELING < @BEGINDATUM_PERIODE) AND ((@EINDDATUM_DIENSTREGELING >= @EINDDATUM_PERIODE) OR (@EINDDATUM_DIENSTREGELING IS NULL )))) BEGIN SET @RESULT = 1 END ELSE SET @RESULT = 0 RETURN @RESULT END |
De functie geeft dus een true of false terug als het record in de periode valt.
Het resultaat:
SQL:
1
2
3
4
5
6
| naam begindatum einddatum HENK 2007-01-01 00:00:00.000 NULL KEES 2008-01-01 00:00:00.000 2015-12-31 00:00:00.000 MARK 2009-03-01 00:00:00.000 2009-04-30 00:00:00.000 MARK 2009-05-01 00:00:00.000 2009-06-30 00:00:00.000 MARK 2009-07-01 00:00:00.000 2009-08-31 00:00:00.000 |
Hierbij wil ik dus ALLEEN het eerste "MARK" record zien, omdat dit het eerste geldige record is van die naam.
Dit is dus het resultaat dat ik zou willen hebben:
SQL:
1
2
3
4
| naam begindatum einddatum HENK 2007-01-01 00:00:00.000 NULL KEES 2008-01-01 00:00:00.000 2015-12-31 00:00:00.000 MARK 2009-03-01 00:00:00.000 2009-04-30 00:00:00.000 |
HOE doe ik dit? Ik heb van alles geprobeerd met MIN(begindatum) en GROUP BY's, maar niets dat enig resultaat oplevert.
Het liefst zou ik het willen oplossen zonder de originele query te herhalen. Ik moet dit namelijk in 20 vrij lange queries herhalen en deze zou ik liever niet allemaal verdubbelen door een subselect te doen.
Alvast hartelijk bedankt!