Prevod datumu pro ulozeni do SQL

Potrebuju prevest datum z tvaru 02 Feb 2003 na tvar, abych ho mohl zapsat do SQL. prevedu ho na 2003-Feb-02 ale vic nevim..je na to nejaka funkce nebo jak to mam udelat??
Predem diky za radu
A proč si to datum nevygeneruješ jako číselné ? Pak jen stačí zadat v databázi typ pole na DATE, popř. DATETIME a máš to.

$date = date("Y-m-d"); //vygeneruje 2003-02-07

INSERT INTO tabulka VALUES('$id','$datum','$nadpis','$text'); //třeba

Abys pak mohl text vypsat na stránkách printem nebo echem (echo), tak si jej jenom převedeš - mktime nebo preg_replace..

$datum = preg_replace("/(\d{4})-(\d{2})-(\d{2})/","\\3.\\2.\\1 ",$date);

nebo to uděláš pomocí pole, které určíš podle znaku "-" a vypíšeš postupně. (split a echo)
tak tohle je presne to co nedelej...
nikdy neukladej datum jako: DATE nebo DATETIME .. vzdycky to dej jako INT UNSIGNED a ukladej tam unixovy casovy udaj ktery vraci fci. time();
pak jen pouzijes Date(); na vyseparovani udaju... jinak se ti s tim pracovat hrozne spatne... asi tak jako Arniemu :)
Já taky používám DATE a DATETIME a netuším, proč tak nedělat. Pokud máš na SQL serveru nastavený stejný čas, nevidím problém. SQL má v sobě spoustu užitečných funkcí pro práci s časem.
nesmysl...
jednou to pochopis
2Master : A proč ? Myslím, že já i Pavel se rádi vzdáme svého přesvědčení, dáš-li nám k tomu pádný argument.

MySQL obsahuje řadu funkcí pro práci s datem, odpadá tak nutnost získávat potřebný údaj skrze PHP. Nehledě na to, že i formát datumu třeba DD.MM.YYYY si mohu nechat poslat jako výsledek SELECTU (viz.DATE_FORMAT). Inkrementační a dekrementační funkce jdou s DATE a DATETIME taky dobře, řazení taky, porovnávání taky. Když si prohlížíš databázi, je to také pohodlnější a přehlednější, poněvadž přímo vidíš datum (nebo datum a čas), než kdyby ses podíval na nějaké číslo, které Ti řejne akorát to, že tento příspěvek je novější, tento starší apod.

Opravdu v tom nevidím háček. Jestli se jedná o to, že tím databázi odlehčím, tak budiž. Muselo by se ale jednat o velký počet operací. V normálních (i velkých) projektech to myslím nemá opodstatnění.

Rád budu dále sdílet své názory, neříkám přitom, že ten Tvůj nepřijmu jednou za svůj. V současné době mi ale nejvíce vyhovuje DATE¨, popř. DATETIME.

A jestli se Ti zpětné fotmátování data zdá složité, věz, že mi ne. Sic bych za to ruku do ohně nedal, ale myslím, že místo :

date("d.m.Y", $unixstamp);

můžeš použít třeba :

date("d.m.Y", strtotime($row[0])); //bez záruky, nezkoušeno

nebo si to pomocí DATE_FORMAT vytáhnout upravené už z databáze.

Pokud by se datum objevovalo na stránkách častěji, proč si na to neudělat function MyDate($datum) { echo preg_replace.......; }. Pokud by to mělo být něco složitějšího, jednoduše to implementovat do třídy jako metodu. Záleží na konkrétním projektu.

Nebudu to tady všechno popisovat, ale mrkni do kapitoly 6.3.4 v MySQL helpu a najdeš tam spoustu užitečných funkcí využivajících DATE nebo DATETIME formát.

S Unixstampem musís všechy údaje předtím, než je uložím do databáze přepočítat - takové to známé x*24*60*60, pokud si chci uložit nějaké datum v budoucnosti. Místo toho si můžu zadat přikaz INSERT INTO tabulka VALUES('$id',DATE_ADD($date, INTERVAL 14 DAY), '$title') a budu to mít, bez přepočítávání, v databázi přehledné atd.

Jak říkám, pokud mne přesvědčíš, nebo ukamenuješ argumenty, přejdu na unixtime.
pracoval jsi nekdy na redakcnim systemu, foru, chatu atd atd... ?
kdyz budu ukladat do formatu: dd.mm.yyyy jak nejjednoduseji prictu 1 hodinu?

tak schvalne.. ja to udelam: $time += 3600;

jestli myslis ze ve velkych projektech se pouziva DATE nebo DATETIME tak se pletes... na Builderu ti na to odpovi...
Jestli znas lidi jako je napr Komplikator (J. Kocman) nebo Spaze (M. Spacek)
tak se jich zeptej.. Spaze je ve foru jeden z nejvetsich odborniku na tuto problematiku a Komplikator pise pro Builder clanky - take ho najdes ve foru.

I ja jsem drive pouzival DATE a DATETIME .. ale to se da rict byli moje zacatky :) ted kdyz to delam profesionalne bych po tomto zapisu nikdy nesahnul... cini to hrozne komplikace, ale na to prijdete casem jestlize do ted jste to nezjistili... nejen moje zkusenosti takto hovori
No abych tedy řekl tak opravdu házet to do mysl jako DATE ci DATETIME je imho blbost... je to vcelku kazdyh vec jak to tam chce, ale pokud to chces u neceho kde to neni pouze info pro uzivatele tak jedine jak rikal master psat to tam do int a jak sekundove cislo od roku 1970 [normalni format fc time()]

Pokud argumenty jak tu nekdo rikal no tak napriklad z DB to nelze distat jako pocet sekund od roku 1970 => musis to mit jako normalni cas a normalni datum tedy pokud bys potom chtel napr ziskat vsechny prispevky ktere byli vlozeny do dizkuze a sou starsi jak 2 dny 10 hodin a 5minut jak to pomoci format dat udelas? U nomalniho si to vse prevedes na sekundy a mas to... kdezto nevim jak bys to resil ty...

Kdyz tak vzpominam kdyz jsem se ucil zaklady mysql tak jsem to tam taky chtel psat, diky bohu nade mnou drzel ochranou a chytrou ruku kamos [po ICQ] ktery mi doporucil abych to delal takhlens pres int nechapal jsem proc a ani se mi to moc nechtelo, ale postupem casu jsem zjistil, ze je to opravdu mnohem lepci nez to tam cpat do DATE... no je to kazdeho vec jak si to cpe do tabulek, ale dle meho je tohle nejlepci a navic to vyuziva vetsina "profesionalnejsich" stranek

Lukasik
kdyz budu ukladat do formatu: dd.mm.yyyy jak nejjednoduseji prictu 1 hodinu? tak schvalne.. ja to udelam: $time += 3600;

Když bud chtít pracovat s časem, použiju DATETIME a pak jednoduše DATE_ADD($date, INTERVAL 1 HOUR).

pokud bys potom chtel napr ziskat vsechny prispevky ktere byli vlozeny do dizkuze a sou starsi jak 2 dny 10 hodin a 5minut jak to pomoci format dat udelas?

SELECT post, uname, DATE_FORMAT('datetime', '%d.%m. %Y') AS fdatetime FROM forum_posts WHERE (datetime <= DATE_SUB(NOW(), INTERVAL "2 10:5" DAY_MINUTE)) AND thread_id = '$thread_id' ... atd.

zatím jsem nepotřeboval vybírat datum společně s příspěvky, ale myslím, že v tom SELECTu by to mohlo být tak, jak jsem to napsal. Je to ale bez záruky, musel bych to vyzkoušet.
TO:Arni
hmmm tak to by mne pri kostrukci mejch stranek upadly ruce nebo bych zavaril klavesnici kdybych pouzil tvoji metodu.
Arnie: jestli se ti zda tvuj postup prehlednejsi, lepsi, jednodussi tak by ses mel nad sebou zamyset proc vlastne delas do programovani, protoze tvoje zdrojaky musi byt silene
Mně se nezdá (komu není rady, tomu není pomoci :-))

DATE_FORMAT('datetime', '%d.%m. %Y') AS fdatetime se dá klidně nahradit jenom datetime a ten si pak zformátovat až ve skriptu. Pokud je na to udělaná funkce, není co řešit.

Nevím, kdo by chtěl vybírat něco, co je 2 dny 10 hodin a 5 minut, jen jsem chtěl demonstrovat, že MySQL zvládá více než SELECT, INSERT a UPDATE.

jestli se ti zda tvuj postup prehlednejsi, lepsi, jednodussi
Přehlednější ano. Přiznám se, že počet sekund od r. 1970 je pro mne nic neříkající údaj. Když se ale podívám na 2003-02-10 07:47:00, hned vím, na čem jsem. Stejně tak, kdybych chtěl odečíst ty 2 dny, 10h:5m, číslo 209100 mi neřekne nic..., ale INTERVAL "2 10:5" DAYS_MINUTE (nebo DAYS HOUR:MINUTE) je psaný tak, že ten časový údaj hned vidím. Je to jako bych četl anglicky. Nehledě na to, že při ukládání toho data do databáze nemusím hodnotu datumu generovat ve skriptu, ale jednoduše nevkládám nic a databáze tam tu právě aktuální hodnotu dosadí.

Lepší ? Hmm...těžko říct, částečně už na to odpovídá předchozí odstavec.

Jednodušší ? Hmm..viz "Přehlednější".
Rád bych podpořil názory Arnieho. Jeho poslední příspěvek mi mluví z duše. Ukládání data ve formátu počtu sekund od 1.1.1970 se mi nezdá úplně nejšťastnější řešení a to přesně z důvodů, které uvedl Arnie. Je to sice o kapku míň pracné, ale rozhodně to nepřispívá k průhlednosti kódu (důvody viz arnieho příspěvek).
A ještě něco, ve VELKÝCH projektech se používá striktně DATE, a to jak v MySQL, tak v ORACLE a jinde.
Takže méně je více jenom někdy!
Howgh!
Vidím, že se strhla zajímavá diskuse :-)

Já jsem ve svém předchozím příspěvku napsal, že DATE používám a netuším, proč tak nedělat. Na tom stále trvám. Copak někdo víte o nějaké chybě v např. MySQL, která by tento datový typ dělala nespolehlivým?

Na druhou stranu si taky nedovedu představit něco na způsob fóra (tzn. moc moc článků) bez Unixového času. Pro tento učel je to jednoznačně nejlepší. Jedno číslo reprezentuje časový údaj o článku a pomocí php už si ho jen přetvořím k obrazu svému.

Věřím, že Unixový čas je dobrým řešením a v profesionálních projektech je nezbytný, ale to není důvod, proč v menší databázi nepoužít DATE. Já ho používám třeba v tomto případě:
dělám stránky pro volejbalový oddíl a u každého zápasu mám v databázi uvedeno datum yyyy-mm-dd. Zápasy nepřibývají každou sekundu a není důležité v které části dne se konají. Stačí "den.měsíc". Ve výsledkovém servise pak zvolím třeba "vypsat za posledních 10 dní" nebo "vybrat za měsíc" a vyřeším to jednoduchým SQL příkazem, namístoi toho, abych pracně počítal interval v Unixovém čase.

PAVEL
nechapu o cem se to tady hadate.. :))
obe metody maji neco do sebe a i kdyz ja napr. mnohem radsi pracuju s unixovskym casem, tak cas od casu date / time pouzivam..
napriklad u unixovskyho casu je problem s prenositelnosti, ne vsechny databazove systemy ho podporuji.. to ze je prehlednejsi nevim k cemu je dobry, stejne vetsinou delas nejake uzivatelske rozhrani (od toho to php je,. ne?:)).
v mysql jsou funkce ktere ti prevedou unix time na mysql formaty a zpatky, takze neni duvod proc to nemit v databazi v datetime a prevadet to az pro vypocty v php..
argument ze jakysi Komplikator pouziva vyhradne unixovsky format mi pripada trochu ..neprofesionalni :-)
Ja pouzivam zasadne unixTimestamp a su spokojenej, na prevod data na time si proste napisu funkci - long d2t(int yrs,int mnt,int day, int hrs, int min, int sec)..... a potom ji jednoduse predam datum a ona mi proste vrati cislo... Co se tyce citelnosti, to je tag tezky napsat si skript, kterej mi to prevede? Nebo by sel udelat i zasah do phpmyadmina... Navic me teda cislo vubec nevadi, je jednodussi, nez datum (i gdyz hur citelny) :-))) Praci s DATE a DATETIME v MySQL sem nigdy nezkousel, kazdopadne pokud cas ukladam jako cislo, je to kompatibilni snad se fsema databazema, problem nastava, pokud potrebuju pouzit datom<1.1.1970, ale na to sem este nenarazil... A taky pri prechodu na jinou DB bs DATE/DATETIME by to znamenalo se naucit rozdily v podpore funkci pro praci s datem, gdyzto <>= je snad fsude stejny... Muj nazor je tedy jednoznacne unixTimestamp!

Omlouvam se fsem za tu blbost, co sem napsal...
no tou kompatibilitou jsem myslel hlavne problemy s odbc a windowsovskejma databazema..
jinak samozrejme na vetsinu veci je vyhodnejsi pouzit unixtimestamp, na druhou stranu kdyz s tim casem pak pracujes casteji v mysql nez v php tak je nekdy jednodussi to ulozit v datetime.. funkce z ansi sql jsou snad uplne vsude, takze v tomhle bych problem taky nevidel..
proste kdyz volim datovy typy ktery pouziju v databazi tak si nejdriv rozmyslim na co ty data pak budu pouzivat a podle toho si vyberu to vyhodnejsi.. nevidim na tomto pristupu nic neprofesionalniho :), spis bych rek ze je spatny uzavirat se pred nekteryma postupama jen proto ze nejktere jine ti prijdou sympatictejsi. (2Master:)