20. januar 2017 - 10:13 Der er 9 kommentarer og
1 løsning

Numeriske tal til tid

Hej.

Jeg har det problem at jeg fra min database får en numerisk streng af tal som faktisk er et klokkeslæt.

Jeg har bare ikke kunne finde en metode til at få den konverteret om.

Bare som afklaring er der ikke tale om Time eller datetime, hvor jeg fra min data fra.

Eksempel.
1032459
Skulle hedde
10:32:45,9  der er millisekunder med ja.

Jeg har MS 2008
Avatar billede ramad Praktikant
20. januar 2017 - 10:34 #1
SELECT CAST(STUFF(STUFF(STUFF(CAST(1032459 as varchar),3,0,':'),6,0,':'),9,0,'.') AS TIME)

Du kan se samme spørgsmål her...
http://stackoverflow.com/questions/12568408/how-to-convert-an-integer-time-to-hhmmss00-in-sql-server-2008
20. januar 2017 - 12:45 #2
Det løser det næsten.
dog opstår der et problem når det eksempelvis er 625384 Da der ikke er nær så mange tal i kolonnen.
Avatar billede ramad Praktikant
20. januar 2017 - 13:09 #3
Så tænker jeg at du enten kan lave lidt logik inden, der beriger din char med et leading '0' inden du cast'er til date. Så du lander på noget ala
SELECT CAST(STUFF(STUFF(STUFF('0625384',3,0,':'),6,0,':'),9,0,'.') AS TIME)

Ellers så skal du have en case hvor du ud fra int størrelse vælger enten
SELECT CAST(STUFF(STUFF(STUFF(CAST(1032459 as varchar),3,0,':'),6,0,':'),9,0,'.') AS TIME)
eller
SELECT CAST(STUFF(STUFF(STUFF(CAST(625384 as varchar),2,0,':'),5,0,':'),8,0,'.') AS TIME)
Avatar billede acore Ekspert
20. januar 2017 - 13:17 #4
I mySQL kan man bruge

LPAD(CAST(625384 as varchar), 7, '0')

der vil give '0625384'.

Mon ikke også det findes i MSSQL?
Avatar billede acore Ekspert
20. januar 2017 - 13:34 #5
Det gør den så tilsyneladende ikke, men

RIGHT(REPLICATE('0', 7) + LEFT(CAST(625384 as varchar), 7), 7)

skulle ifølge http://www.sqlines.com/oracle/functions/lpad kunne bruges i stedet
20. januar 2017 - 13:59 #6
@Acore

Den indsætter et 0 foran ja.
Men nu konvertere den jo ikke strengen til et klokkeslæt.
,CAST(STUFF(STUFF(STUFF(CAST(OPRETTET_KLOK as varchar),3,0,':'),6,0,':'),9,0,'.') AS TIME)AS KLOKKEN

virker ind til talrækken er for kort.

Så kan ikke lige se hvordan jeg skal få din kode med ind.

@Ramad
Den vil ikke køre din kode CAST(STUFF(STUFF(STUFF(CAST(OPRETTET_KLOK as varchar),2,0,':'),5,0,':'),8,0,'.') AS TIME) as klokken
grundet følgende fejl.
Conversion failed when converting date and/or time from character string.
Avatar billede acore Ekspert
20. januar 2017 - 14:09 #7
Den sætter 0 foran, men kun indtil 7 tegn - det var i hvert fald tanken. Så samlet bliver det til:

CAST(STUFF(STUFF(STUFF(RIGHT(REPLICATE('0', 7) + LEFT(CAST(OPRETTET_KLOK as varchar), 7), 7),3,0,':'),6,0,':'),9,0,'.') AS TIME) AS KLOKKEN
20. januar 2017 - 14:13 #8
Mange tak Acore.
Det virker, jeg kunne bare ikke se hvor jeg sætte det ind før at det gik op.

Jeg er helt ny i SQL så det med lige at forstå all syntax er ikke helt nem.
Avatar billede acore Ekspert
20. januar 2017 - 14:16 #9
Nej, den blev lidt kringlet. Generelt er læsbarheden af SQL kode sjældent helt i top, synes jeg.

Men hvis du er helt ny i SQL, skal du nok komme efter det :)
Avatar billede kjulius Novice
14. marts 2017 - 18:59 #10
De viste løsninger er lige lovligt kringlede synes jeg. De går alle omvejen over en streng, hvilket som regel ikke er befordrende for hastigheden. Mit alternativ ville være at gøre brug af simpel aritmetik og så ellers bruge DateAdd funktionen:

declare @intTime int = 1032459 -- skal opfattes som 10:32:45.9

select dateadd(hour,@intTime / 100000, dateadd(minute, @intTime / 1000 - @intTime / 100000 * 100, dateadd(second,@intTime % 1000 / 10, dateadd(millisecond,@intTime % 10 * 100,0)))) as LoggedTime

Resultat:
LoggedTime
-----------------------
1900-01-01 10:32:45.900

DateAdd caster til DateTime, derfor kommer "dummy-datoen" med, men den vll blive undertrykt hvis det overføres til f.eks. Excel.

Hvis du vil se det i Time format kan du tilføje en ekstra cast til Time:
select cast(dateadd(hour,@intTime / 100000, dateadd(minute, @intTime / 1000 - @intTime / 100000 * 100, dateadd(second,@intTime % 1000 / 10, dateadd(millisecond,@intTime % 10 * 100,0)))) as time) as LoggedTime

Resultatet vises så som:
LoggedTime
----------------
10:32:45.9000000

Hvis du skulle undre dig over beregningerne, så tænk på, at SQL Server behandler alle tal som integer (også mellemresultater) med mindre man skriver konstanter som f.eks. 10.0 -- havde jeg gjort det, var mellemresultaterne blevet til floating point variabler og en beregning som 1032459 / 100.0 ville være blevet til 10324,59 -- nu, hvor jeg bare bruger heltal, så bliver det i stedet til 10324 (decimalerne bliver altså smidt væk). Ikke helt logisk, men sådan er det, og så kan man jo bare udnytte det. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester