Drar upp en gammal tråd men jag ska nu göra exakt samma sak som ovanstående i MySQL, alltså spara tider i formatet minuter:sekunder:hundradelar.
Ska även här användas till beräkningar i ett senare skede.
Vilken datatyp bör användas?
Tack!
Databaser & SQLur Databashanterare & SQL
14 svar · 1 560 visningar · startad av sadsmile
Hej
Håller på med att bygga upp en databas i MySQL. I en tabell så skall jag lagra tider iform av minuter:sekunder:hundradelssekunder.
Jag undrar nu om det går att få med det där med hundradelar i MySQL. Har försökt att läsa in mig på TIME men det enda jag har sett än så länge är formatet HH:MM:SS.
Skall använda värderna till beräkningar, skulle jag inte göra det så skulle jag kunna lagrat det hela i textformat eller så.
Anders
Drar upp en gammal tråd men jag ska nu göra exakt samma sak som ovanstående i MySQL, alltså spara tider i formatet minuter:sekunder:hundradelar.
Ska även här användas till beräkningar i ett senare skede.
Vilken datatyp bör användas?
Tack!
Hittade den här tråden:
http://pellesoft.se/communicate/forum/view.aspx?msgid=242841&forumid=24&sum=0
Där föreslås att man sparar allt i hundradelar. Finns det något smart sätt att med PHP konvertera fram och tillbaka om man utgår ifrån att man i applikationen anger tiden i tre separata fält? Det står stilla i huvudet.
Antingen så sparar du det som antal hundradelar (Min*60*100+Sec*100+Hundradelar) eller så kan du spara det som ett flyttal (unixtimestamp.hundradelar) nackdelen med flyttal att du kan få avrundningsfel fördelen är att det finns färdiga funktioner att hantera unixtimestamp.
Fast med unixtimestamp så måste jag ju ange ett helt datum va? Det här ska användas till en applikation för anmälan till tävlingar. När man anmäler sig måste man ange sin rekordtid på de grenar man vill anmäla sig till.
I förlängningen ska det även användas för bl.a. topplistor och även en spärrfunktion för att få möjligheten att "spärra anmälan för alla med ett sämre rekord än xx".
På forumet på MySQL.com hittade jag ett tips om att ha två kolumner, en för sekunder och en för hundradelar. Sen bör jag kunna slå ihop dom här med t.ex. CONCAT_WS.
Tips: Undvik två kolumner om du ska ställa sql-frågor emot dem. Att göra beräkningar i databasen vid jämförelser är allt annat än bra för prestandan. T.ex. så kan inga index användas, vilket kommer bli katastrof.. :)
(Man kan dela frågan såklart, ställa två villkor istället för ett beräknat, men jag är lite kluven där. Det känns ändå bättre att lägga all information i en kolumn, jag tror du har igen det flera gånger om)
Fast med unixtimestamp så måste jag ju ange ett helt datum va? Det här ska användas till en applikation för anmälan till tävlingar. När man anmäler sig måste man ange sin rekordtid på de grenar man vill anmäla sig till.
Ok, då är det enklast att skapa ett heltal (min första variant) och lägga det i en kolumn då kan du enkelt sortera listan.
Ok, om jag räknar ut heltalet enligt din princip ovan (Min*60*100+Sec*100+Hundradelar) hur får jag "tillbaka" det sen? För användvänlighetens skulle tänkte jag ha tre textrutor (Minut/Sekund/Hundradel) och om jag sen vill visa "heltalet" uppdelat i de tre boxarna, hur gör jag? Står helt still i skallen.
Borde väl gå med
Hundradelar * 60 * 100 + Hundradelar * 100 + Hundradelar
1 min, 10 sek och 88 hundradelar = 7088 (1 min = 6000 = 60 * 100)
10 sek = 1000 (100 * 10)
6000 + 1000 + 88 =7088.
Ok, då är det enklast att skapa ett heltal (min första variant) och lägga det i en kolumn då kan du enkelt sortera listan.
Heltal? Det är ju det som är grejen, konverterar jag mm:ss.hh så blir det ju inga heltal, t.ex. 01:20.98 blir ju isf:
[B]1[/B] * 60 * 100 + [B]20[/B] * 100 + [B]98[/B] = [B]602098[/B]
Fint, men hur får jag tillbaka 602098 till 01:20.98?
/R
Sorry, missförstod dig.. Men frågan återstår hur jag får tillbaka till ursprungsformatet.
Det går väl att göra precisbaklänges. Med exemplet 1:10:88
Sen om du gör det i sql, eller din kod, det är väl vilket som (här från databasen med sql:
declare @mins int
declare @secs int
declare @hund int
set @mins = (7088/6000)
set @secs = (7088-(@mins*6000))/100
set @hund = 7088-(@mins*6000)- (@secs*100)
select @mins as minuter ,@secs as sekunder ,@hund as hundradelar
/pebi
b242569: Fast han ville ju göra det baklänges. :)
Rätt svar:
$temp = $resultset['value'];
$hundradelar = $temp % 100;
$temp = (int)($temp / 100);
$sekunder = $temp % 60;
$temp = (int)($temp / 60);
$minuter = $temp % 60;
$temp = (int)($temp / 60);
$timmar = $temp;
Sen skulle du så klart kunna fortsätta enligt samma mönster och få ut dagar (24) om du vill det.
Sen en annan tanke: Se till att validera datat du stoppar in, så ingen skriver in 110 hundradelar av misstag.
Är kanske dum nu, men gjorde såhär:
$foo['temp'] = 602098; // startvärde taget från mitt exempel i inlägg ovan (01:20.98)
$foo['hundradelar'] = $foo['temp'] % 100;
$foo['temp'] = (int)($foo['temp'] / 100);
$foo['sekunder'] = $foo['temp'] % 60;
$foo['temp'] = (int)($foo['temp'] / 60);
$foo['minuter'] = $foo['temp'] % 60;
$foo['temp'] = (int)($foo['temp'] / 60);
$foo['timmar'] = $foo['temp'];
$debug[] = print_r($foo, true);
Resultatet blir:
Array
(
[temp] => 1
[hundradelar] => 98
[sekunder] => 20
[minuter] => 40
[timmar] => 1
)
Var kommer 1 timma och 40 minuter ifrån?
Men,
$foo['temp'] = 602098; // startvärde taget från mitt exempel i inlägg ovan (01:20.98)
Det stämmer ju inte.
Det är ju minst en siffra för mycket, en minut. är 60 sekunder, dvs 60*100 hundradelar = 6000
Så 1:20:98 borde ju vara 6000+(20*100)+98 = 8098
/pebi
Ja, ahh, dum jag är. Körde det där i Kalkylatorn och glömde bort (), så den multiplicerade ju fel.
Tack ska ni ha, allt stämmer nu.