MikiHalasko
01.06.10,11:00
ahojte!
mam problem.
Chcem urobit select v mysql, kde potrebujem vediet kolko mesiacov prebehne medzi mesiacom x a mesiacom y a zobrazi sa v z. format datumu je yyyy-mm-dd
select z sql nefunguje.
select meno, xzacatek, ykonec, months_between (zacatek,konec) ztrvani from profi;
dakujem za rady.
TomasHC
01.06.10,11:09
MySQL taku funkcu nema - http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Mozes vypocitat rozdiel UNIX_TIMESTAMP a potom vysledok vydelit tak, aby vysiel v mesiacoch ;)
MikiHalasko
01.06.10,12:05
MySQL taku funkcu nema - http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Mozes vypocitat rozdiel UNIX_TIMESTAMP a potom vysledok vydelit tak, aby vysiel v mesiacoch ;)
napises mi prosim ta ako si predstavujes cely prikaz?
monchi
01.06.10,12:21
neviem ci MySQL pozna funkciu convert, ale mohlo by to vypadat takto:
:

select zaciatok,koniec,(convert(integer,datepart(mm,zacia tok)) - convert(integer,datepart(mm,koniec))) as rozdiel
from tabulka
, v pripade ze roky nie su rovnake treba tam dorobit rozdiel na roky * 12 + rozdiel.

/M
TomasHC
01.06.10,12:31
napises mi prosim ta ako si predstavujes cely prikaz?


SELECT FLOOR(ABS(UNIX_TIMESTAMP('xxxxxx') - UNIX_TIMESTAMP('yyyyy')) / (3600 * 24 * 30))

xxxxx a yyyyy vo formate '2007-11-30 10:30:19'

Priklad:


FLOOR(ABS(UNIX_TIMESTAMP('2007-11-30 10:30:19') - UNIX_TIMESTAMP('2010-01-15 16:05:45')) / (3600 * 24 * 30))

Vysledok: 25

EDIT: Ale pocitam tam blbo na pevno mesiac = 30 dni, takze to treba pocitat cez 365,25 / mesiace , kvoli priestupnym rokom.

Nebude to jednoduchsie riesit na strane servra (PHP, ASP)?
MikiHalasko
01.06.10,12:45
mam format date yyyy-mm-dd aj si ho chcem nechat, celu databazu mam tak zalozenu. 25 tabuliek.
nefunguju vase rady.
neviem najst na nete priklad. :(
TomasHC
01.06.10,12:51
mam format date yyyy-mm-dd aj si ho chcem nechat, celu databazu mam tak zalozenu. 25 tabuliek.
nefunguju vase rady.
neviem najst na nete priklad. :(


SELECT FLOOR(ABS(UNIX_TIMESTAMP(CONCAT('zaciatok', ' 00:00:00')) - UNIX_TIMESTAMP(CONCAT('koniec', ' 00:00:00'))) / (3600 * 24 * 30))

Potom moze byt zaciatok aj koniec vo formate yyyy-mm-dd .

Treba si prestudovat dokumentaciu, su tam popisane vsetky textove, matematicke, kalendarne aj ine funkcie MySQL...

Priklad v praxi:

FLOOR(ABS(UNIX_TIMESTAMP(CONCAT('2008-05-12', ' 00:00:00')) - UNIX_TIMESTAMP(CONCAT('2010-08-29', ' 00:00:00'))) / (3600 * 24 * 30))

Vysledok: 27
MikiHalasko
01.06.10,13:05
SELECT FLOOR(ABS(UNIX_TIMESTAMP(CONCAT('zaciatok', ' 00:00:00')) - UNIX_TIMESTAMP(CONCAT('koniec', ' 00:00:00'))) / (3600 * 24 * 30))

Potom moze byt zaciatok aj koniec vo formate yyyy-mm-dd .

Treba si prestudovat dokumentaciu, su tam popisane vsetky textove, matematicke, kalendarne aj ine funkcie MySQL...

Priklad v praxi:

FLOOR(ABS(UNIX_TIMESTAMP(CONCAT('2008-05-12', ' 00:00:00')) - UNIX_TIMESTAMP(CONCAT('2010-08-29', ' 00:00:00'))) / (3600 * 24 * 30))

Vysledok: 27
taky vysledok, tosom nechcel
TomasHC
01.06.10,17:33
Takto sa neda radit... :(
MikiHalasko
02.06.10,06:02
ja viem, napriek tomu som to vyskusal, neva, diki
monchi
02.06.10,06:04
Skus toto:
select zaciatok,koniec,(convert(integer,montht(zacia tok)) - convert(integer,month(koniec))) as rozdiel
from tabulka

ak nepojde pastni sem chybovu hlasku.
/M
TomasHC
02.06.10,06:09
Skus toto:
select zaciatok,koniec,(convert(integer,montht(zacia tok)) - convert(integer,month(koniec))) as rozdiel
from tabulka

ak nepojde pastni sem chybovu hlasku.
/M

Nebude ten Tvoj kod pocitat maximalne do 12 mesiacov? Mam pocit, ze to nezohladnuje YEAR(zaciatok) a YEAR(koniec) :confused:
TomasHC
02.06.10,06:13
MikiHalasko: preco nepouzivas http://www.phpmyadmin.net/home_page/index.php na spravovanie MySQL databazy? Je to ovela komfortnejsie!
MikiHalasko
02.06.10,06:15
Skus toto:
select zaciatok,koniec,(convert(integer,montht(zacia tok)) - convert(integer,month(koniec))) as rozdiel
from tabulka

ak nepojde pastni sem chybovu hlasku.
/M
neda sa neda :)
TomasHC
02.06.10,06:32
Uz to mam, nemali tam byt uvodzovky :)

SELECT zacatek, konec, FLOOR( ABS( UNIX_TIMESTAMP( CONCAT( zacatek, ' 00:00:00' ) ) - UNIX_TIMESTAMP( CONCAT( konec, ' 00:00:00' ) ) ) / ( 3600 *24 *30 ) ) AS rozdiel
FROM profi
MikiHalasko
02.06.10,06:52
Uz to mam, nemali tam byt uvodzovky :)

SELECT zacatek, konec, FLOOR( ABS( UNIX_TIMESTAMP( CONCAT( zacatek, ' 00:00:00' ) ) - UNIX_TIMESTAMP( CONCAT( konec, ' 00:00:00' ) ) ) / ( 3600 *24 *30 ) ) AS rozdiel
FROM profi
vysledok
MikiHalasko
02.06.10,07:14
MikiHalasko: preco nepouzivas http://www.phpmyadmin.net/home_page/index.php na spravovanie MySQL databazy? Je to ovela komfortnejsie!
nerozumiem po anglicky.
TomasHC
02.06.10,07:39
nerozumiem po anglicky.

http://navody.c4.cz/phpmyadmin-instalace

Nie kazdy moze byt programator :(
PaloPa
02.06.10,08:39
Napríklad takto

Funkcia:

CREATE FUNCTION f_months_between( p_end DATE , p_start DATE ) RETURNS MEDIUMINT RETURN PERIOD_DIFF( EXTRACT(YEAR_MONTH FROM p_end) , EXTRACT(YEAR_MONTH FROM p_start) );

Použitie:

SELECT `tbl_content`.`created`, `tbl_content`.`modified`, f_months_between( `tbl_content`.`modified` , `tbl_content`.`created` ) as x_month_diff
FROM `tbl_content`

... za predpokladu že created a modified sú typu datetime

Palo
monchi
02.06.10,09:07
select zaciatok,koniec,((cast(month(zaciatok) as unsigned) - cast(month(koniec) as unsigned)) + (cast(year(zaciatok) as unsigned) - cast(year(koniec) as unigned)*12))
as rozdiel
from tabulka

najskor skus len s mesiacom a ked pojde tak pridaj rok

/M
MikiHalasko
02.06.10,09:15
select zaciatok,koniec,((cast(month(zaciatok) as unsigned) - cast(month(koniec) as unsigned)) + (cast(year(zaciatok) as unsigned) - cast(year(koniec) as unigned)*12))
as rozdiel
from tabulka

najskor skus len s mesiacom a ked pojde tak pridaj rok

/M
mam format date yyyy-mm-dd
sthruska
02.06.10,09:27
Je úplne jedno aký máš formát dátumu. Databáza v zásade pozná len jeden. Iná vec je v akom formáte/ako ti ho ukáže.
month - vyberá mesiac
year - vyberá rok
MikiHalasko
02.06.10,09:43
select zaciatok,koniec,((cast(month(zaciatok) as unsigned) - cast(month(koniec) as unsigned)) + (cast(year(zaciatok) as unsigned) - cast(year(koniec) as unigned)*12))
as rozdiel
from tabulka

najskor skus len s mesiacom a ked pojde tak pridaj rok

/M
nieco to vyhodilo, ale je tooho nejak vela, nevyznamsa.
japec
08.06.10,12:10
SELECT meno,
PERIOD_DIFF ( EXTRACT( YEAR_MONTH FROM konec ) , EXTRACT( YEAR_MONTH FROM zacatek )) AS rozdiel
FROM profi

alebo

SELECT meno,
PERIOD_DIFF (DATE_FORMAT(konec,'%Y%m'),DATE_FORMAT(zacatek,'%Y %m')) AS rozdiel
FROM profi