Gå til innhold

Vise minutter som hh:mm fra SQL-server


Anbefalte innlegg

Jeg har en database hvor tid er registrert som minutter i en tabell. I en rapport (Reporting Services) skal jeg hente sum av minutter for utvalget, og kunne tenke meg å presentere dette som hh:mm. Jeg kan ikke se at jeg har så mange muligheter til å formatere dette i selve rapporten ut over å eventuelt bruke DateAdd() dersom det er mulig. Jeg må innrømme at mulighetene der går litt over hodet mitt på kvelden. Alternativet er å få verdien ferdig ut av spørringen. Noen som klarer å hjlepe meg med et uten å bygge en egen funksjon eller prosedyre inn i databasen?

Endret av enden
Lenke til kommentar
Videoannonse
Annonse

Bruk Modulo (og gjerne google)

 

http://msdn.microsoft.com/en-us/library/ms190279.aspx

http://msdn.microsoft.com/en-us/library/ms175009.aspx

 

Gitt at du har f.eks. 231 minutter

 

select 231 / 60 as timer, 231 % 60 as minutter

 

Forutsetter at delingen av heltall runder nedover slik det ser ut som i flg. dokumentasjonen (If an integer dividend is divided by an integer divisor, the result is an integer that has any fractional part of the result truncated.)

 

I motsatt fall blir det isteden

 

select (231 - (231 % 60)) / 60 as timer, 231 % 60 as minutter

 

... hva som er tilfelle får jeg ikke verifisert.

Endret av quantum
Lenke til kommentar

Det ser ut til at du har rett i første eksempel ja. Har ikke testet det grundig enda, men basert på et tilfeldig utvalg så det korrekt ut.

 

Jeg har bare litt formatpirk. Verdier under 10 representeres med enkelttall og ikke 0x. Er det enkelt å få til?

Lenke til kommentar
Det ser ut til at du har rett i første eksempel ja. Har ikke testet det grundig enda, men basert på et tilfeldig utvalg så det korrekt ut.

 

Jeg har bare litt formatpirk. Verdier under 10 representeres med enkelttall og ikke 0x. Er det enkelt å få til?

Formattering er en jobb for presentasjonslaget, ikke databasen. Sjekk ut Format funksjonen eller Format egenskapen til TextBox.
Lenke til kommentar
Formattering er en jobb for presentasjonslaget, ikke databasen. Sjekk ut Format funksjonen eller Format egenskapen til TextBox.

Modulo-kalkulasjonen kan du også med fordel gjøre som en del av presentasjonen, så blir det bare en verdi og ikke to å holde styr på ellers omkring i koden. Men det er kanskje knotete å få til i rapporteringsverktøyet?

Endret av quantum
Lenke til kommentar

Nja, jeg fikk til Modulo-kalkulasjonen greit nok bare jeg fant korrekt notasjon. Jeg er forøvrig helt enig i at dette er en jobb for presentasjon, ikke database. Kjekt å vite at man faktisk kan gjøre ganske mye med uttrykkene i selve rapporten :)

 

Formateringen er litt værre. Textboxen består nå av

=Fields!minutterBrukt.Value \ 60 & ":" & Fields!minutterBrukt.Value Mod 60

Tallformateringen til Textbox ser ikke ut til å bite på output fra dette. Skal leke litt mer med hva jeg skal spytte ut for å få tallformateringen til å fungere, for der finnes der ferdig format for hh:mm. Må bare være litt sammen med familien først :wee: Hvis noen har tips til meg er det bare å pøse på!

Lenke til kommentar

Har bare forslag for postgres sin løsning, tipper du kommer langt med det du har fått her allerede

 

select to_char(231*'1 minute'::interval, 'HH24:MI')

 

For rapporter eller andre plasser hvor jeg ikke skal gjøre noe mer med dataene synes jeg databasen er riktig sted å gjøre formateringen. Databasen sine funksjoner for dette er gjerne rimelig overlegne på dette feltet (ytelse/minnebruk).

Endret av blackbrrd
Lenke til kommentar
Har bare forslag for postgres sin løsning, tipper du kommer langt med det du har fått her allerede

 

select to_char(231*'1 minute'::interval, 'HH24:MI')

 

For rapporter eller andre plasser hvor jeg ikke skal gjøre noe mer med dataene synes jeg databasen er riktig sted å gjøre formateringen. Databasen sine funksjoner for dette er gjerne rimelig overlegne på dette feltet (ytelse/minnebruk).

 

Hehe, ikke akkurat best-practice, men når man bruker et rapporteringsverktøy så blir det jo gjerne slik, for rapportdefinisjonen inneholder jo gjerne både layout og spørring i en og samme bundle.

 

Hvordan en implementasjon av en funksjon a'la to_char kan bli så veldig mye mer effektiv når den kjører i databasen enn i f.eks. webserveren(php) er dog for meg en gåte ...

Lenke til kommentar
Databasemetoder er gjerne bedre optimalisert enn tilsvarende metoder i PHP, Java, e.l. BigDecimal håndteringen i java er f.eks vesentlig tregere enn tilsvarende implementasjon i Postgres (med numeric).

 

Hadde de brukt postgres i køben hadde de nok fått til en orntli klimaavtale også. Helt sikkert.

Lenke til kommentar
Databasemetoder er gjerne bedre optimalisert enn tilsvarende metoder i PHP, Java, e.l. BigDecimal håndteringen i java er f.eks vesentlig tregere enn tilsvarende implementasjon i Postgres (med numeric).

 

Hadde de brukt postgres i køben hadde de nok fått til en orntli klimaavtale også. Helt sikkert.

WTF? :D

 

Jeg har bare litt formatpirk. Verdier under 10 representeres med enkelttall og ikke 0x. Er det enkelt å få til?

Er du egentlig sikker på at du vil ha padding? Det er jo ikke klokkeslett dette.

Han har lyst på det, prøv å få deg et kjappt overblikk tid skrevet ut uten padding:

13:12

1:1

12:9

7:12

20:1

 

Med padding - kanskje litt lettere å lese? ;)

13:12

01:01

12:09

07:12

20:01

Endret av blackbrrd
Lenke til kommentar
Nja, jeg fikk til Modulo-kalkulasjonen greit nok bare jeg fant korrekt notasjon. Jeg er forøvrig helt enig i at dette er en jobb for presentasjon, ikke database. Kjekt å vite at man faktisk kan gjøre ganske mye med uttrykkene i selve rapporten :)

 

Formateringen er litt værre. Textboxen består nå av

=Fields!minutterBrukt.Value \ 60 & ":" & Fields!minutterBrukt.Value Mod 60

Tallformateringen til Textbox ser ikke ut til å bite på output fra dette. Skal leke litt mer med hva jeg skal spytte ut for å få tallformateringen til å fungere, for der finnes der ferdig format for hh:mm. Må bare være litt sammen med familien først :wee: Hvis noen har tips til meg er det bare å pøse på!

 

Prøv:

(Fields!minutterBrukt.Value \ 60).ToString("00") & ":" & (Fields!minutterBrukt.Value Mod 60).ToString("00")

Lenke til kommentar
Prøv:

(Fields!minutterBrukt.Value \ 60).ToString("00") & ":" & (Fields!minutterBrukt.Value Mod 60).ToString("00")

Det fjernet faktisk data i stedet for å legge til padding :) 10:50 ble til 1:5 mens 0:0 ikke ble endret

Sannsynligvis datatypekluss. Prøv denne:

 

=System.Convert.ToInt32(Floor(Fields!minutterBrukt.Value / 60)).ToString("00") & ":" & system.Convert.ToByte(Fields!minutterBrukt.Value mod 60).ToString("00")

Lenke til kommentar
Utvilsomt mer lesbart, pointet mitt var dårlig formulert, tenkte det kanskje var et poeng å formatere så det ikke ser ut som klokkeslett. Ikkeno stort poeng, dog ...
Må si meg enig med deg quantum. Det kan forvirre brukeren til å forvejklse med et tidspunkt.

Bedre å skrive f.eks. 08h44m, eller i klartekst 8 hours and 44 minutes. Men nå skal ikke jeg drive å leke belærende. TS velger selv.

Lenke til kommentar

Jo, jeg har sett den, men formateringen er en smal sak å endre dersom sjefen er enig. Fordelen med et enkelt skilletegn er plass, noe jeg har lite av slik rapportene er utformet. Kan selvfølgelig endre det fra kolon til noe annet, men tar jeg når rapportene ellers er ferdige.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...