webForumDet fria alternativet

Hundradels sekunder

Databaser & SQLur Databashanterare & SQL

14 svar · 1 560 visningar · startad av sadsmile

Medlem sedan jan. 2002177 inlägg
Frågan#1

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

Medlem sedan feb. 20034 441 inlägg
#2

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!

Medlem sedan feb. 20034 441 inlägg
#3

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.

Medlem sedan juni 20014 290 inlägg
#4

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.

Medlem sedan feb. 20034 441 inlägg
#5

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".

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.

Medlem sedan juli 2003555 inlägg
#6

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)

Medlem sedan juni 20014 290 inlägg
#7

MickeA.com skrev:

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.

Medlem sedan feb. 20034 441 inlägg
#8

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.

Medlem sedan sep. 20051 760 inlägg
#9

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.

Medlem sedan feb. 20034 441 inlägg
#10

GunnarD skrev:

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.

Medlem sedan jan. 2005327 inlägg
#11

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

Medlem sedan aug. 20039 342 inlägg
#12

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.

Medlem sedan feb. 20034 441 inlägg
#13

Ä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?

Medlem sedan jan. 2005327 inlägg
#14

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

Medlem sedan feb. 20034 441 inlägg
#15

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.

140 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)