| 
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
 | 
 | 
| autor | 
 | 
nexus4 
Kreisi kasutaja 
 
  
liitunud: 01.03.2012 
 
 
 
 
  | 
 
19.12.2012 15: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: 14.07.2002 
 
 
 
 
  | 
 | 
	
		
			
			
				| Kommentaarid: 25 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  0 :: | 
				  25 | 
			 
			 
		 | 
	
| tagasi üles | 
 | 
  | 
nexus4 
Kreisi kasutaja 
 
  
liitunud: 01.03.2012 
 
 
 
 
  | 
 
19.12.2012 15: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 16: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 16: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: 26.02.2003 
 
 
 
 
  | 
 
19.12.2012 23: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 00: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 00: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 19: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 | 
 | 
  | 
 |