Toon posts:

[MSSQL] Probleempje met SELECT icm Datum

Pagina: 1
Acties:

Verwijderd

Topicstarter
Volgende is het probleem.

Ik heb een tabel als deze:
code:
1
2
3
4
5
6
7
8
Type           Datum
1              31-12-2004
1              06-01-2005
2              02-01-2005
2              05-01-2005
3              06-01-2005
4              10-01-2005
4              03-02-2005


Nou wil ik met een select alleen de Type nr's selecteren, waarvan een datum niet buiten het opgegeven bereik valt.

Als ik dit doe, krijg ik namelijk alle types:

SELECT Type
FROM blabla
WHERE datum >= convert(datetime, '01-01-2005') AND datum <= convert(datetime, '01-31-2005')
GROUP BY Type

Terwijl ik dan alleen de type nrs met alle data in januari wil hebben, dus type 2 en type 3.

Bovenstaand is een voorbeeld uit een zeer complexe situatie, maar het probleem komt op hetzelfde neer.

Ik denk dat je met een min en max moet werken, maar weet niet hoe dit te integreren :(

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
Enige wat me op dit moment even te binnen schiet is een subselect:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT DISTINCT
    type
FROM
    Test
WHERE
    type NOT IN 
    ( 
        SELECT 
            type 
        FROM 
            Test 
        WHERE 
            datum < convert(datetime, '01-01-2005') OR 
            datum  > convert(datetime, '01-31-2005') 
    )

[ Voor 15% gewijzigd door sig69 op 29-04-2005 10:57 ]

Roomba E5 te koop


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Hm, als ik je vraag goed lees moet je query gewoon werken

Je wilt dus alle types waarvan de datum binnen de 2 opgeven datums valt. Onderstaande is trouwens in eenvoudiger:

code:
1
2
3
SELECT *
FROM Tabel
WHERE Datum BETWEEN [datum1] AND [datum2]


Waarom doe je trouwens een convert, je moet je datums altijd in een DateTime opslaan, niet in een tekstveld.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
P_de_B schreef op vrijdag 29 april 2005 @ 11:00:
Hm, als ik je vraag goed lees moet je query gewoon werken

Je wilt dus alle types waarvan de datum binnen de 2 opgeven datums valt. Onderstaande is trouwens in eenvoudiger:
Dat klopt, maar alleen de types waarvan er geen records voorkomen buiten de periode (type 1 dus niet ).
code:
1
2
3
SELECT *
FROM Tabel
WHERE Datum BETWEEN [datum1] AND [datum2]
BETWEEN rekent 1-1-2005 en 31-1-2005 niet mee
Waarom doe je trouwens een convert, je moet je datums altijd in een DateTime opslaan, niet in een tekstveld.
Ik denk dat hij de convert hier alleen doet omdat het een testquery is die even in dit voorbeeld gebruikt wordt. En hij convert de datum niet, maar de parameter. Het datum veld wordt niet geconvert

[ Voor 7% gewijzigd door sig69 op 29-04-2005 11:17 ]

Roomba E5 te koop


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
sig69 schreef op vrijdag 29 april 2005 @ 11:03:
[...]

Dat klopt, maar alleen de types waarvan er geen records voorkomen buiten de periode (type 1 dus niet ).

[...]
Zie je wel, ik snapte het toch niet :P dan is jouw query natuurlijk correct.
BETWEEN rekent 1-1-2005 en 31-1-2005 niet mee
Wel volgens Books Online:
quote: Books Online
Result Value
BETWEEN returns TRUE if the value of test_expression is greater than or equal to the value of begin_expression and less than or equal to the value of end_expression.

NOT BETWEEN returns TRUE if the value of test_expression is less than the value of begin_expression or greater than the value of end_expression.
Ik denk dat hij de convert hier alleen doet omdat het een testquery is die even in dit voorbeeld gebruikt wordt. En hij convert de datum niet, maar de parameter. Het datum veld wordt niet geconvert
De convert snap ik niet, ook in een testquery moet hij niet nodig zijn.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
P_de_B schreef op vrijdag 29 april 2005 @ 11:07:
[...]
Wel volgens Books Online:
[...]
Je hebt gelijk, dan had ik het even verkeerd in m'n hoofd zitten.

Roomba E5 te koop


  • n3ck
  • Registratie: Mei 2002
  • Laatst online: 24-07-2025
Moet het niet order by ipv group by zijn?

Verwijderd

Topicstarter
En een oplossing in de vorm van eerst MIN(datum) berekenen, en dan deze waarde in de WHERE clause gebruiken?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
n3ck schreef op vrijdag 29 april 2005 @ 11:24:
Moet het niet order by ipv group by zijn?
Group by zorgt er in dit geval voor dat er unieke Types worden terug gegeven.
Verwijderd schreef op vrijdag 29 april 2005 @ 11:34:
En een oplossing in de vorm van eerst MIN(datum) berekenen, en dan deze waarde in de WHERE clause gebruiken?
Hoe had je dat voor je gezien?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • n3ck
  • Registratie: Mei 2002
  • Laatst online: 24-07-2025
Nouja goed; gooi er dan een select distinct tegenaan

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
n3ck schreef op vrijdag 29 april 2005 @ 11:44:
Nouja goed; gooi er dan een select distinct tegenaan
Wordt hetzelfde uitgevoerd, maakt niet uit dus :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

'k Denk zoiets ( niet 100% zeker over de syntax, maar de logica klopt)

code:
1
2
3
4
select veld
from tabel
group by veld
having sum(case when datum<#1/1/2005# and datum>=#1/2/2005# then 1 else 0)=0

Verwijderd

Topicstarter
D4Skunk schreef op vrijdag 29 april 2005 @ 12:03:
'k Denk zoiets ( niet 100% zeker over de syntax, maar de logica klopt)

code:
1
2
3
4
select veld
from tabel
group by veld
having sum(case when datum<#1/1/2005# and datum>=#1/2/2005# then 1 else 0)=0
Zelfde resultaat, ook type 1-4

  • lier
  • Registratie: Januari 2004
  • Laatst online: 09:13

lier

MikroTik nerd

Twee vragen:

Welk type heeft het datum veld ?
Waarom doe je de dag en de maand omdraaien in de convert methode, terwijl deze wel in het "andere" formaat in de table staat ?

Opmerking:
Niet alle operators zijn bruikbaar voor datetime velden. Het beste kan je gebruik maken van "between and" constructie. (zie ook sig69...)

[ Voor 38% gewijzigd door lier op 29-04-2005 12:25 ]

Eerst het probleem, dan de oplossing


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
Verwijderd schreef op vrijdag 29 april 2005 @ 12:08:
[...]


Zelfde resultaat, ook type 1-4
Het goede resultaat moet 2 en 3 zijn
lier schreef op vrijdag 29 april 2005 @ 12:13:
Twee vragen:

Welk type heeft het datum veld ?
Waarom doe je de dag en de maand omdraaien in de convert methode, terwijl deze wel in het "andere" formaat in de table staat ?
In sql server staat een datum niet in een datumformaat in de tabel, maar in het aantal x 0.00333 seconden vanaf 1753 als ik goed heb. Het is dus niet zo dat hij de maand en dag omdraait, dit is de standaard manier waarop sql server zijn invoer aanneemt. Als je 31-1-2005 invoert, zal hij wel automatisch begrijpen dat het andersom is en zelf zorgen da het wel goed gaat. Eventueel kan je nog een datetime format specifieren, bijvoorbeeld: CONVERT( DateTime, '31-1-2005', 105 )

[ Voor 68% gewijzigd door sig69 op 29-04-2005 12:32 ]

Roomba E5 te koop


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

2de poging :)
code:
1
2
3
4
select veld
from tabel
group by veld
having min(datum)>=#1/1/2005# and max(datum)<#1/2/2005#

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
Aangezien het hier om MS SQL gaat:
SQL:
1
2
3
4
select type
from Test
group by type
having min(datum)>=CONVERT( DATETIME, '1-1-2005' ) and max(datum)<= CONVERT( DATETIME, '31-1-2005', 105 )


Samen komen we er wel uit :)

[ Voor 16% gewijzigd door sig69 op 29-04-2005 12:45 ]

Roomba E5 te koop


Verwijderd

SQL:
1
2
3
4
SELECT DISTINCT Type
FROM blabla
WHERE datum BETWEEN '2005-01-01' AND '2005-01-31'
ORDER BY Type ASC

[ Voor 20% gewijzigd door Verwijderd op 30-04-2005 01:34 ]


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

@sinaasappelsap : de ts vroeg een resultaat waarbij alle datums van een bepaald type binnen januari vallen, er mag dus maw geen enkele datum buiten januari vallen. Jouw oplossing geldt voor 'minstens 1' ipv 'alle'

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:11
P_de_B schreef op vrijdag 29 april 2005 @ 11:00:
Hm, als ik je vraag goed lees moet je query gewoon werken
en toch vraag ik me af wat die group by in z'n query doet...

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

whoami schreef op maandag 02 mei 2005 @ 11:57:
[...]
en toch vraag ik me af wat die group by in z'n query doet...
zorgen voor unieke waarden...

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:11
D4Skunk schreef op maandag 02 mei 2005 @ 12:10:
[...]


zorgen voor unieke waarden...
Een group by zonder aggregate functie is zinloos.
Enkel in MySQL kan dat, en dat is dan nog een verkeerde werkwijze ook.
Als je unieke waarden wilt, dan doe je een distinct.

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

whoami schreef op maandag 02 mei 2005 @ 12:12:
[...]


Een group by zonder aggregate functie is zinloos.
Enkel in MySQL kan dat, en dat is dan nog een verkeerde werkwijze ook.
Als je unieke waarden wilt, dan doe je een distinct.
Normaalgezien moet je idd distinct gebruiken, maar ik denk dat group by zonder aggregate zeker in MSSQL/Oracle kan.
Uiteindelijk denk ik dat het intern toch niet echt een verschil maakt ? De db verwerkt ze beiden tot hetzelfde commando ?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 22:49

curry684

left part of the evil twins

whoami schreef op maandag 02 mei 2005 @ 12:12:
[...]

Een group by zonder aggregate functie is zinloos.
Enkel in MySQL kan dat, en dat is dan nog een verkeerde werkwijze ook.
Als je unieke waarden wilt, dan doe je een distinct.
Onzin, group by mag je mee doen wat je wil zolang je alle niet-grouped velden in een aggregate functie hebt zitten. Als je dus maar 1 field select en die groupt voldoe je perfect aan de regels, en dat mag in MSSQL ook gewoon.

Je bent in de war met een ander MySQL probleempje, waarbij MySQL 'by design' random resultaten presenteert ;)

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:11
curry684 schreef op maandag 02 mei 2005 @ 12:41:
[...]

Onzin, group by mag je mee doen wat je wil zolang je alle niet-grouped velden in een aggregate functie hebt zitten. Als je dus maar 1 field select en die groupt voldoe je perfect aan de regels, en dat mag in MSSQL ook gewoon.
Hmm, idd.
Ben echt niet goed bezig vandaag. :X

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op maandag 02 mei 2005 @ 12:12:
[...]


Een group by zonder aggregate functie is zinloos.
Enkel in MySQL kan dat, en dat is dan nog een verkeerde werkwijze ook.
Als je unieke waarden wilt, dan doe je een distinct.
Nee hoor, in dit geval is het hetzelfde als een DISTINCT :)

edit:hmm, wat Curry dus al uitgebreider en eerder gepost had.

[ Voor 9% gewijzigd door P_de_B op 02-05-2005 13:12 ]

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1