Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  SQL probleem: ajavahemik märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 19.12.2012 16:16:27 SQL probleem: ajavahemik vasta tsitaadiga

On tabel, kus on
veergudeks: mingi sündmus, aeg (pp.kk.aaaa)

Vaja on kuvada sündmused etteantud ajavahemikus.
Näiteks alates 12.12.2011 kuni 10.10.2012

Kas SQL'iga saab kuidagi aegasi võrrelda?
Siiani olen ainukese lahendusena hakanud eraldi võrdlema aastaid, siis kuid, siis päevi, aga kuna alguspäev või kuu saab olla suurema väärusega kui lõpupäev/kuu siis läks asi pikaks ja sassi.

Panen mingi üllitise ka mis tehtud, number 2'ga on lõpu ajad ja number 1'ga alguse ajad. Kuna andmeid on tabelis väga palju ei oska täielikult kontrollida kas kõik klapib, kuid karvane tunne on et kuvab midagi valesti.


select * from tabel where

(
(param.aasta2 - param.aasta1) < 1 AND
store.aasta = param.aasta1 AND
(param.kuu2 - param.kuu1) < 1 AND
store.kuu = param.kuu1 AND
store.day >= param.paev1 AND
store.day <= param.paev2
)

OR

(
(param.aasta2 - param.aasta1) < 1 AND
store.aasta = param.aasta1 AND
(param.kuu2 - param.kuu1) > 0 AND
((store.kuu = param.kuu1 AND store.day >= param.paev1) OR
(store.kuu > param.kuu1 AND store.kuu < param.kuu2) OR
(store.kuu = param.kuu2 AND store.day <= param.paev2))
)

OR

(
(param.aasta2 - param.aasta1) > 0 AND
((store.aasta = param.aasta1 AND ((store.kuu = param.kuu1 AND store.day >= param.paev1) OR
(store.kuu > param.kuu1))) OR
(store.aasta > param.aasta1 AND store.aasta < param.aasta2)OR
(store.aasta = param.aasta2 AND ((store.kuu = param.kuu2 AND store.day <= param.paev2) OR
(store.kuu < param.kuu2))))
)

Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 26
tagasi üles
vaata kasutaja infot saada privaatsõnum
mattiaza
HV kasutaja
mattiaza

liitunud: 15.07.2002




sõnum 19.12.2012 16:21:37 vasta tsitaadiga

Aasta + kuu + päev asemel tasuks kasutada "date" andmetüüpi, millega on võrdlused sama lihtsad kui igasuguste numbritega. See on olemas kõigis populaarsetes andmebaasides, näiteks http://www.postgresql.org/docs/9.2/static/datatype-datetime.html ja http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html .
Kommentaarid: 25 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 19.12.2012 16:40:56 vasta tsitaadiga

Aeg on tegelikult antud ühes lahtris kujul pp.kk.aaaa ja to_char'iga võtsin eraldi päeva kuu ja aasta välja icon_redface.gif

okei, piinlik, tundub et saangi lihtsalt võrrelda neid.

Kuidas ma täpsemalt neid võrdlen? kas selline kuju võrdleb siis kuupäevi:

select * from tabel where etteantudaeg1 < tabelisolevaeg < etteantudaeg2


tabelisolevaeg on kujul aa.pp.aaaa , kas etteantudaeg peab olema ülakomadevahel? Ehk kui kasutaja tahab algusajaks sisestada 10. okt. 2010 siis ta peab kirjutama etteantudaeg1 väärtuseks kuupäeva kujul '101010' ? või kuidas.
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 26
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 19.12.2012 17:01:46 vasta tsitaadiga

Tegelikult on SQLis BETWEEN ka olemas:

SELECT FROM WHERE date1 BETWEEN date2 AND date3

Võid ka muidugi teha nii:

SELECT FROM WHERE date1 < date3 AND date1 > date2

Kasutaja etteantud andmed pead muidugi süsteemis endas ümber konvertima. See ei ole miski, millega andmebaas või kasutaja tegelema peaks.

E: Ja üldiselt on generic SQL niivõrd levinud, et googlisse "date between" annab rohkem otsinguid kui keegi jõuaks läbi lugeda. Esimesed vastused on enamasti küllalt. Niivõrd lihtsate asjade puhul on tegelikult lihtsam otsingut kasutada icon_wink.gif

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 19.12.2012 17:21:49 vasta tsitaadiga

seesuuretjah, ei no tegelikult ma teemat kirjutades hakkasin vist ise ka aru saama. mõtlesin ise lihtsalt ülesande keeruliseks endale ja seda just tänu selle teise keskkonna ja selle sisestus võimaluste pärast.

tänud kaasamõtlejatele eniveis beer_yum.gif
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 26
tagasi üles
vaata kasutaja infot saada privaatsõnum
wiinanina
HV kasutaja

liitunud: 27.02.2003




sõnum 20.12.2012 00:57:27 vasta tsitaadiga

madedog kirjutas:
Tegelikult on SQLis BETWEEN ka olemas:

SELECT FROM WHERE date1 BETWEEN date2 AND date3

Võid ka muidugi teha nii:

SELECT FROM WHERE date1 < date3 AND date1 > date2

Kasutaja etteantud andmed pead muidugi süsteemis endas ümber konvertima. See ei ole miski, millega andmebaas või kasutaja tegelema peaks.

E: Ja üldiselt on generic SQL niivõrd levinud, et googlisse "date between" annab rohkem otsinguid kui keegi jõuaks läbi lugeda. Esimesed vastused on enamasti küllalt. Niivõrd lihtsate asjade puhul on tegelikult lihtsam otsingut kasutada icon_wink.gif


Date-ga tuleb ettevaatlik olla.
Enamuses sql baasides ei kasutata praktiliselt mitte kuupäeva(date) vaid aega (datetime)
ja vastavatses võrdlustes on väga suur vahe, kas küsitakse võrdluses või between'is tagumiseks ajaks '2012-12-19' või '2012-12-19 23:59:59'
päingu tegija jaoks võib see olenevalt kasutajaliidesest samaväärne olla.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 20.12.2012 01:20:53 vasta tsitaadiga

Ei hakka siiski juuksekarva lõhki ajama. Kui probleemid tekkima hakkavad, võib alati troubleshootima hakata ning leida, et kasutada tuleks interval 1 day kui ajad sees on.
_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
gynterk
HV kasutaja

liitunud: 17.01.2004




sõnum 20.12.2012 01:45:43 vasta tsitaadiga

madedog kirjutas:
Ei hakka siiski juuksekarva lõhki ajama. Kui probleemid tekkima hakkavad, võib alati troubleshootima hakata ning leida, et kasutada tuleks interval 1 day kui ajad sees on.


Lihtsam on antud case puhul DATE(datetime) teha.
sql:
  1. SELECT * FROM `fish` WHERE DATE(`fishing_time`) BETWEEN '2012-12-20' AND '2012-12-21';


Selle case puhul arvestatakse 2012-12-21 lõpukuupäeva hulka (st kellaaega üldse võrdlemisel ei kasutatagi), kui aga jätta DATE() panemata, siis arvestataks kuni 2012-12-21 00:00:00.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 20.12.2012 20:19:13 vasta tsitaadiga

a)
date1 BETWEEN date2 AND date3 on sama, mis date1 >= date2 AND date1 <= date3 (mitte lihtsalt '>' ja '<')
'2012-12-21 00:00:00' jääks between korral kahte vahemikku BETWEEN '2012-12-20' AND '2012-12-21' ja BETWEEN '2012-12-21' AND '2012-12-22'
Korrektsem oleks kasutada mittelõikuvaid vahemikke.
sql:
  1. WHERE date1 >= date2 AND date1 < date3

b)
Tabeli veeru väärtustele võiks funktsioone rakendada ainult siis, kui seal on vastav funktsionaalne indeks.
Kui näiteks otsinguvormilt on sisendiks 2012-12-20' ja '2012-12-21' ning väljundisse vaja kuni '2012-12-21 23:59:59'
sql:
  1.  
  2. WHERE date1 >= '2012-12-20' AND date1 < adddate('2012-12-21', 1);
  3.  
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  SQL probleem: ajavahemik
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.