Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
19.12.2012 16:16:27
SQL probleem: ajavahemik |
|
|
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 |
|
 |
mattiaza
HV kasutaja

liitunud: 15.07.2002
|
|
Kommentaarid: 25 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
25 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
19.12.2012 16:40:56
|
|
|
Aeg on tegelikult antud ühes lahtris kujul pp.kk.aaaa ja to_char'iga võtsin eraldi päeva kuu ja aasta välja
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 |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
19.12.2012 17:01:46
|
|
|
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
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt. |
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
19.12.2012 17:21:49
|
|
|
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
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
wiinanina
HV kasutaja
liitunud: 27.02.2003
|
20.12.2012 00:57:27
|
|
|
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  |
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 |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
20.12.2012 01:20:53
|
|
|
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 |
|
 |
gynterk
HV kasutaja
liitunud: 17.01.2004
|
20.12.2012 01:45:43
|
|
|
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:
|
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 |
|
 |
nemu
HV vaatleja

liitunud: 22.01.2002
|
20.12.2012 20:19:13
|
|
|
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:
|
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:
|
WHERE date1 >= '2012-12-20' AND date1 < adddate('2012-12-21', 1);
|
|
|
Kommentaarid: 12 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
11 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
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
|
|