Přejít na obsah


Fotka

dtupdate / dtupdate2 a zistani data

geoget

  • Pokud chcete vložit odpověď, přihlašte se
19 odpovědí na toto téma

#1 dejwy

dejwy

    dejwy

  • Members
  • PipPipPip
  • 336 příspěvků(y)

Publikováno 16 leden 2014 - 12:31

Ahoj kolegové,

nějak se mi nedaří získat seznam keší, které nebyly aktualizovány déle než 7 dnů.

 

Mám SQL dotaz:

SELECT id FROM geocache WHERE (dtupdate < date('now', '-7 days'));

Ale ten pochopitelně nechodí, protože formát dtupdate a date('now') je odlišný a já nějak nejsem schopen oboje převést na stejný formát abych mohl porovnat obě straby výrazu dtupdate < date('now', '-7 days')

 

Děkuji za nakopnutí

 


  • 0

#2 gord

gord

    Advanced Member

  • Members
  • PipPipPip
  • 6 631 příspěvků(y)

Publikováno 16 leden 2014 - 12:35

K tomuto jsem uz jednou reseni popsal, takze jen odkaz http://geoget.ararat...e?s[]=dtupdate2 Vsimni si zejmena poznamky1.


  • 0

MHD/PID vybranych mest CR jako POI (diskuse)
GeoGet:
- OwnMaintenance - prehled udrzby vlastnich kesi - v1.1.3 (diskuse)
- Combine 2 - automatizace opakovanych cinnosti (diskuse, dávky)
- Spoiler - uložení spoilerů do GPS jako POI (diskuse)

- Stator - statistiky y GeoGetu (diskuse)

- Náhrada GJ legálními postupy

 


#3 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 16 leden 2014 - 12:45

Proc nepouzijes standardni postup pres filtr?


  • 1

#4 tarmara

tarmara

    Air-cooled

  • Members
  • PipPipPip
  • 506 příspěvků(y)

Publikováno 16 leden 2014 - 13:00

jeden takovy myslenkovy postup: pokud ten dotaz potrebujes na to, abys vypsal kese, ktere nebyly aktualizovane nelsi dobu, tak je mozne pouzit 

SELECT id, dtupdate FROM geocache WHERE cachestatus < 2 
and dtfound=0
order by dtupdate2 asc
limit 5000

To ti vybere poslednich (zde 5000) kesi s nejstarsim datem aktualizace.... Ja si takhle jednou za den vyplivnu kesky a zaktualizuju.... Ale je mozne ze to mas na neco jineho. 


  • 0

tarmara.png


#5 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 16 leden 2014 - 13:05

Ze s tim porad tak otravuji, ale proc na to nepouzijete normalni filtr, kde si muzete nastavit "neaktualizovano poslednich X dnu"?


  • 1

#6 dejwy

dejwy

    dejwy

  • Members
  • PipPipPip
  • 336 příspěvků(y)

Publikováno 16 leden 2014 - 13:34

K tomuto jsem uz jednou reseni popsal, takze jen odkaz http://geoget.ararat...e?s[]=dtupdate2 Vsimni si zejmena poznamky1.

 

Poznámky jsem si všimnul, ale nepochopil neb je to v Delphi/ Pascalu a já to chci jen v SQL a nevím jak převést date('now'), což je např. 2014-01-16 a dtupdate formát, což je např. 20140116 na shodný formát (unix čas of 1970) a pak porovnat.


Ze s tim porad tak otravuji, ale proc na to nepouzijete normalni filtr, kde si muzete nastavit "neaktualizovano poslednich X dnu"?

 

Ahoj,

protože jsem chtěl využít SQL pro možnost udělat složitější dotaz a něco se i přiučil. Jinak jasně, jde to filtrem, to nerozporuji.


  • 0

#7 dejwy

dejwy

    dejwy

  • Members
  • PipPipPip
  • 336 příspěvků(y)

Publikováno 16 leden 2014 - 13:37

jeden takovy myslenkovy postup: pokud ten dotaz potrebujes na to, abys vypsal kese, ktere nebyly aktualizovane nelsi dobu, tak je mozne pouzit 



SELECT id, dtupdate FROM geocache WHERE cachestatus < 2 
and dtfound=0
order by dtupdate2 asc
limit 5000

To ti vybere poslednich (zde 5000) kesi s nejstarsim datem aktualizace.... Ja si takhle jednou za den vyplivnu kesky a zaktualizuju.... Ale je mozne ze to mas na neco jineho. 

 

Ahoj Honzo,

díky, tohle jsem našel, ale nechci vyfiltorvat posl. xx keší s nejstarší aktualizací, ale konkrétně keše nektualizované déle, než xx dnů. A SQL proto, že mi to přišlo jako idea, že se přiučím, leč mne dostaly různé formáty date('now') vs dtupdate


  • 0

#8 dejwy

dejwy

    dejwy

  • Members
  • PipPipPip
  • 336 příspěvků(y)

Publikováno 16 leden 2014 - 13:40

K tomuto jsem uz jednou reseni popsal, takze jen odkaz http://geoget.ararat...e?s[]=dtupdate2 Vsimni si zejmena poznamky1.

 

Ahoj,

díky, neboj , já si jí všimnul, koukal jsem tam když jksem se koukal na strukturu db, ale ty popisuješ kombinaci Delphi (Pascal) + SQL, ne?

A jak tohle dostat jen do SQL to nevím. date('now', '-1 day') vrátí 2014-01-15, ale dtupdate vrací jinak formátovaný string - 20140115

 

Já bych to rád udělal SQL dotazem....


Tento příspěvek byl upraven od dejwy: 16 leden 2014 - 13:40

  • 0

#9 taxoft

taxoft

    Advanced Member

  • Members
  • PipPipPip
  • 587 příspěvků(y)

Publikováno 16 leden 2014 - 14:00

A co si ten string rozřezat pomocí left(dtupdate, 4), right(dtupdate, 2) a left(right(dtupdate,4),2) či pomocí middle(), jestli tu funkci SQLite zná, a zase ho spojit s vloženými pomlčkami?


  • 0

Klidně se rozčilujte.


#10 gord

gord

    Advanced Member

  • Members
  • PipPipPip
  • 6 631 příspěvků(y)

Publikováno 16 leden 2014 - 14:10

Je to tak, dtupdate neni cislo, ale string s datem ve tvaru RRRRMMDD. Takze prevod je jednoduchy :-)


  • 0

MHD/PID vybranych mest CR jako POI (diskuse)
GeoGet:
- OwnMaintenance - prehled udrzby vlastnich kesi - v1.1.3 (diskuse)
- Combine 2 - automatizace opakovanych cinnosti (diskuse, dávky)
- Spoiler - uložení spoilerů do GPS jako POI (diskuse)

- Stator - statistiky y GeoGetu (diskuse)

- Náhrada GJ legálními postupy

 


#11 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 16 leden 2014 - 14:11

dtupdate je ale ve skutecnosti nepouzivana plozka (jen kdyz neexistuje dtupdate2, ktere navic obsahuje i cas), a je tam je pro zpetnou kompatibilitu. Takze bych se na ni moc nespolehal.


  • 0

#12 dejwy

dejwy

    dejwy

  • Members
  • PipPipPip
  • 336 příspěvků(y)

Publikováno 16 leden 2014 - 14:26

Taxoft:

To by šlo, ale dostanu string a u něj se blbě dělá -1 den, -10 dnů apod, abych nemusel řešit přechody přes konec měsíce, roku... a pod.

Tudíž to chce převést na UTC či tak něco (UNIXový počet dnů od 1970 asi ideál)

 

HaLuMa

dtupdate či dtupdate2 .. oboje je string a nedá se porovnat s date('now') .

 

Jak tedy oboje (dtupdate2 a date('now')) převést na stejný formát - ideálně číselný a to Unixový počet dnů od 1970?

 

gord

jak pro koho....  :(


  • 0

#13 tarmara

tarmara

    Air-cooled

  • Members
  • PipPipPip
  • 506 příspěvků(y)

Publikováno 16 leden 2014 - 14:27

a pokud se nemylim, (Delphi moc neznam), tak dtupdate2 obsahuje cas vyjadreny jako pocet dni od 1.ledna 1900 vcetne desetinne casti pro hodiny, ze? 


  • 0

tarmara.png


#14 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 16 leden 2014 - 14:34

dtupdate2 je floatingpoint cislo, zadny string. Je to skoro tak, jak pise tamara, konkretne je to od pulnoci 31.12.1899. Cele cislo je pocet dnu, desetinna cast je logicky necela cast dne, tedy cas.

 

Chces-li tedy pocet dnu od 1.1.1970, staci odecist vhodnou konstantu. Pokud potrebujes treba misto poctu dnu pocet sekund, staci to pak vynasobit poctem sekund v jednom dni.


  • 0

#15 mikrom

mikrom

    Advanced Member

  • Members
  • PipPipPip
  • 1 748 příspěvků(y)

Publikováno 16 leden 2014 - 15:02

pro doplneni: pokud se nepletu tak dtupdate je zachovan jen pro zpetnou kompatibilitu, nove se uz nejaky cas pouziva dtupdate2


  • 0

#16 LudekV

LudekV

    Advanced Member

  • Members
  • PipPipPip
  • 1 771 příspěvků(y)

Publikováno 16 leden 2014 - 15:09

Nebudu řešit, jaký to má smysl, jen odpovím na dotaz. Prostým pohledem do manuálu SQLite snadno najdeš vhodnou funkci:

SELECT id FROM geocache WHERE (dtupdate < strftime('%Y%m%d', 'now', '-7 days'))

Tento příspěvek byl upraven od LudekV: 16 leden 2014 - 15:10

  • 0

a : Drake - vše potřebné pro (offline) geocaching na Android
Stránka projektu na GitHubu - požadavky a reklamace
PocketDrake - vše potřebné pro (offline) geocaching na PDA (WindowsMobile)


#17 dejwy

dejwy

    dejwy

  • Members
  • PipPipPip
  • 336 příspěvků(y)

Publikováno 16 leden 2014 - 15:49

LudekV

Díky, jen pozior, ze pouzivas vsemi zatracovany dtupdate a nikoliv dtupdate2

 

 

 

Moje prozatim funkcni reseni:

SELECT id FROM geocache WHERE (dtupdate2 < (julianday('now') - julianday('1899-12-30') -7));

Ten offset mezi časem v dtupdate a 'now' v datetime je offsetem UTC vs naše časová zóna?

 

 

Zupdatuji keš a dostanu:

select dtupdate2 from geocache where id='GC4VGE9';
41655.6576784722

Kdežto 'now' vrací:

SELECT (julianday('now') - julianday('1899-12-30'));
41655.6162335183

  • 0

#18 tarmara

tarmara

    Air-cooled

  • Members
  • PipPipPip
  • 506 příspěvků(y)

Publikováno 16 leden 2014 - 15:50

ano, dtupdate je celkem jednoduchy. ale jak rikal HaMuLa, tehle sloupec uz je skoro "historicky" a mel by se pouzivat dtupdate2. Chapu i jeho vyznam z hlediska pouziti pri programovani skriptu v pascalu (nemusi se resit prevod mezi db a pascal formatem. Ale my databazisti se hlasime o slovo a chceme si s nim taky hrat :). Jsem ve fazi hledani te spravne konstanty, tak abysme byli schopni ho nacpat do strftime funkce a pracovat s nim jako s dtupdate... 

A prave tahle zalezitost uz neni tak easy. Je nutne zjistit od kdy se pocita cas v SQLite, od kdy v delfske funkci NOW(), podivat se na wiki, zapojit do toho juliansky kalendar, vymyslet/odvodit/ziterovat vhodnou bulharskou konstantu a reseni pro dtupdate2 je na svete:

SELECT ID, DTUPDATE, DTUPDATE2
  FROM GEOCACHE
 WHERE STRFTIME('%J', DTUPDATE2 + 2415018.46) <
       STRFTIME('%J', 'now', '-10 days')
 ORDER BY DTUPDATE DESC;

Neni to sice na hodinu presne, mozna v tom hraji roli i casova pasma, uplnek a buh vi co jeste...ale zhruba to funguje. Stejne bych se ale primlouval za dtupdate3, kde bude dtupdate2 prevedeno do SQLite date formatu :) Hlavne pro tehle prevod nepouzivejte tu vyse uvedenou kontstantu. Bud pouzit nejaky sofistikovany Delphi prevod a nebo ustanovit vedecky team, ktery tu konstantu urci alespon na 5 desetinnych mist a zjisti vliv casovych pasem (protoze kdyz jsem zaktualizoval v GG kesku, tak hned po tom jsem v db videl, ze SQLite 'now' hodnota je NIZSI, nez zaznam v dtupdate2 u zaktualizovane kesky). Pro pripadne testovani jsem pripraven sehrat roli testovaci veverky.


  • 0

tarmara.png


#19 tarmara

tarmara

    Air-cooled

  • Members
  • PipPipPip
  • 506 příspěvků(y)

Publikováno 16 leden 2014 - 15:54

aha...tak dejwy me predbehl i s efektivnejsim resenim....berte predchozi prispevek jako takovou humornou vlozku :)

EDIT- a ta konstanta je opravdu 2415018.5 co jsem nasel na wiki, ale stejne jako Dejwyho me zmatl ten rozdil v hodinach...


Tento příspěvek byl upraven od tarmara: 16 leden 2014 - 16:03

  • 0

tarmara.png


#20 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 16 leden 2014 - 16:29

Ano, casy jsou v lokalnim casovem pasmu, i kdyz to se mozna u nove generace DB zmeni.


  • 0





Také označené jedním nebo více z těchto klíčových slov:geoget

0 uživatel(ů) prochází toto téma

0 uživatelů, 0 návštěvníků 0 anonymních uživatelů

Reklama