Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Onbekende timestamp

Pagina: 1
Acties:

  • DaVa
  • Registratie: Maart 2005
  • Laatst online: 09:14
Dames, heren,

Voor een opdrachtje moet ik gegevens uit een SQL DB halen en in een log steken.
Op zich geen probleem alleen dat er in die DB een kolom is met de datum/tijd in een voor mij onbekend formaat ... moet het dus converteren naar een gewone datum/tijd notatie.

Voorbeeld van een timestamp = 41260,649132
(bovenstaande timestamp zou van 15/08/2013 omstreeks 13u moeten zijn)

Iemand enig idee hoe ik de conversie doe?

grtz

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

het wordt imho berekend in dagen na jaar x. 1900 ofzo. gewoon even terugrekenen

daarnaast heb je sql commando's die dat kant en klaar voor je doen -> google

[ Voor 33% gewijzigd door Fish op 15-08-2013 14:43 ]

Iperf


  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 21-11 15:31

TheNephilim

Wtfuzzle

Beetje raar met die komma erin, check http://www.epochconverter.com/ voor valide timestamps.

Met FROM_UNIXTIME() kun je in MySQL een timestamp omzetten naar een datum.

In PHP kun je gewoon date() gebruiken.

  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 20:19
41260 lijkt me het aantal dagen sinds 1-1-1900

  • Daos
  • Registratie: Oktober 2004
  • Niet online
41260 is grofweg 112 jaar en 352 dagen. Als je telt vanaf 1-1-1900 kom je in december 2012 terecht.

0,649132 is een tijd van 15:34:45 (h:m:s)

Gebruikte code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
double timestamp = 41260.649132;
Console.WriteLine(timestamp);

int days_total = (int)timestamp;

// date
Console.WriteLine("{0} days", days_total);
int years = (int)(days_total / 365.25);
int days = (int)(days_total - years * 365.25);
// TODO: calc date

// time
double time = timestamp - days_total;
int hours = (int)(time * 24);
time = time * 24 - hours;
int minutes = (int)(time * 60);
time = time * 60 - minutes;
int seconds = (int)Math.Round(time * 60);

// print
Console.WriteLine("{0} years & {1} days", years, days);
Console.WriteLine("{0}:{1}:{2}", hours, minutes, seconds);

// check
timestamp = (((double)seconds / 60 + minutes) / 60 + hours) / 24 + days_total;
Console.WriteLine(timestamp);

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 21-11 15:31

TheNephilim

Wtfuzzle

Ah op die fiets, een eigen implementatie dus?

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Alle implementaties zijn eigen implementaties :P

Aantal dagen sinds 1-1-1900 is in ieder geval bij MSSQL gangbaar, DaVa geeft alleen niet aan welk systeem hij gebruikt.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Is gewoon een Excel datestamp. Zet maar eens in Excel en verander het type naar DateTime: 17-12-2012 15:34:45

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Datum/tijd bepalen kan ook zo:
C#:
1
2
3
4
5
6
double timestamp = 41260.649132;

DateTime origin = new DateTime(1899, 12, 30);
DateTime dt = origin.AddDays(timestamp);
Console.WriteLine("{0}-{1}-{2}", dt.Day, dt.Month, dt.Year);
Console.WriteLine("{0}:{1}:{2}", dt.Hour, dt.Minute, dt.Second);


edit: of nog korter:
C#:
1
2
3
4
5
double timestamp = 41260.649132;

DateTime dt = DateTime.FromOADate(timestamp);
Console.WriteLine("{0}-{1}-{2}", dt.Day, dt.Month, dt.Year);
Console.WriteLine("{0}:{1}:{2}", dt.Hour, dt.Minute, dt.Second);

[ Voor 34% gewijzigd door Daos op 15-08-2013 18:32 ]


  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 20:19
Dagen sinds 1-1-1900 is onder andere gebruikelijk bij het NTP protocol.
Excel wijkt daar 1 dag vanaf. Vanaf 0-jan-1900 dus.
Zie ook wikipedia.

[ Voor 3% gewijzigd door dik_voormekaar op 15-08-2013 18:29 ]


  • DaVa
  • Registratie: Maart 2005
  • Laatst online: 09:14
Hoi,

Alvast bedankt voor de reacties.
Het is inderdaad zo dat de datum vanaf 1900 loopt.
Maar de tijd heb ik nog niet helemaal door.
Van onderstaande waarde ben ik zeker dat de vermelde tijd correct is (op enkele seconden na), hoe kom ik daaraan?
41504,785174 = 18/08/2013 - 18u50

Uiteindelijk moet ik de conversie in SQL zien te doen (van bestaande tabel met bovenstaande notatie naar view met normale weergave van tijd en datum)

  • Harm
  • Registratie: Mei 2002
  • Niet online
Op http://stackoverflow.com/...el-date-to-unix-timestamp is het een en ander te vinden over hoe je Excel-date-time kunt converteren naar Unix-timestamp. Als je het eenmaal in dat formaat hebt, kun je er alles mee doen wat je wil.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
De datum loopt vanaf 30-12-1899. Hoe je zelf de tijd berekent uit het deel achter de komma had ik al laten zien. Later heb ik laten zien dat je ook 1 functie in C#/.Net kan gebruiken die de conversie voor je doet: MSDN: DateTime.FromOADate Method (System)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Heeft je RDBMS hier niet gewoon functies voor?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • WormLord
  • Registratie: September 2003
  • Laatst online: 11:04

WormLord

Devver

Oftewel, welke SQL DB gaat het over? MS SQL, MySQL, Oracle, ....?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DaVa schreef op zondag 18 augustus 2013 @ 19:19:
Van onderstaande waarde ben ik zeker dat de vermelde tijd correct is (op enkele seconden na), hoe kom ik daaraan?
41504,785174 = 18/08/2013 - 18u50
Da's toch geen rocket-science?

Als 't deel voor de komma de dagen is vanaf 1900 (dit in je achterhoofd houdend) dan is 't deel achter de komma dus 't dagdeel.

Dus 0,785174 * 24 = 18,844176 = 18u + (0,844176 * 60 min = 50,65056 = 50 min) + (0,65056 * 60 ≅ 39 sec) => 18:50:39.

Of je rekent in minuten: 0,785174 * (24 * 60) = 1.130,65056 min. na 0:00 ≅ 18:50:39.
Of je rekent in seconden: 0,785174 * (24 * 60 * 60) ≅ 67.839 seconden na 0:00 =18:50:39.

Of je doet 't gewoon in 1 keer: 41504,785174 * (24 * 60 * 60) = 3.586.013.439,0336 seconden na 1-1-1900 => 18 aug. 2013 18:50:39 (wederom met de Excel-quirck in je achterhoofd).

En zoals hieronder ook gezegd: Probeer 't eens in .Net gewoon door 41504,785174 dagen bij "epoch" (die je in dit geval op 30-12-1899 stelt) op te tellen: voila.

[ Voor 19% gewijzigd door RobIII op 21-08-2013 18:57 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Ik heb geen Excel, maar LibreOffice Calc. Als ik 0 omzet naar DatumTijd krijg ik toch echt "30-12-1899 00:00:00". Als je in C#/.Net de timestamp hierbij optelt krijg je de juiste waarde zoals ik al had laten zien in Daos in "Onbekende timestamp"

Het is dus niet vanaf 1-1-1900 of 0-1-1900, maar 30-12-1899. 1900 is overigens geen schrikkeljaar.

edit:
RobIII schreef op woensdag 21 augustus 2013 @ 18:24:
Dus 0,785174 * 24 = 18,844176 = 18u + (0,844176 * 60 min = 50,65056 = 50 min) + (0,65056 * 60 ≅ 39 sec) => 18:50:39.
In code doe je dat zo:
Daos schreef op donderdag 15 augustus 2013 @ 15:50:
Gebruikte code:
C#:
12
13
14
15
16
17
18
19
20
21
22
// time
double time = timestamp - days_total;
int hours = (int)(time * 24);
time = time * 24 - hours;
int minutes = (int)(time * 60);
time = time * 60 - minutes;
int seconds = (int)Math.Round(time * 60);

// print
// ...
Console.WriteLine("{0}:{1}:{2}", hours, minutes, seconds);
Ik blijf in de herhalingen vallen :O

[ Voor 50% gewijzigd door Daos op 21-08-2013 18:54 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hoe je dat in code veel makkelijker doet post ik net :P Maar dat was inderdaad al een aantal keren gepost; het ging er mij om (de rest van de post) dat TS snapt hoe 't in elkaar steekt.

[ Voor 36% gewijzigd door RobIII op 21-08-2013 18:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ik vind het in het algemeen niet zo'n best advies om gewoon maar te gaan rekenen met datums. Je kunt je nog aardig vergissen in schrikkeltoestanden die je niet kunt afleiden uit een getalletje dat wel "ongeveer vorige week vrijdag" zou moeten zijn. Zorg dat je weet met wat voor data (als in "gegevens") je te maken hebt en wat voor standaard functies of libraries er zijn om daarmee te werken. Het is wel goed om te weten hoe je zoiets zelf zou kunnen berekenen, maar het is nog beter om te weten waarom je dat beter niet zelf kunt doen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
drm schreef op donderdag 22 augustus 2013 @ 01:45:
Ik vind het in het algemeen niet zo'n best advies om gewoon maar te gaan rekenen met datums. Je kunt je nog aardig vergissen in schrikkeltoestanden die je niet kunt afleiden uit een getalletje dat wel "ongeveer vorige week vrijdag" zou moeten zijn.
Zolang je date/time functies (zoals ik deed met .AddDays(double value)) gebruikt komt dat wel goed. Dat is nog altijd beter dan zelf liggen frotten met schrikkeljaren en whatnot inderdaad.
drm schreef op donderdag 22 augustus 2013 @ 01:45:
Zorg dat je weet met wat voor data (als in "gegevens") je te maken hebt
Dat geldt altijd en overal voor. Context is belangrijk. Uiteindelijk is 't allemaal een shitload aan enen en nullen ;)
drm schreef op donderdag 22 augustus 2013 @ 01:45:
en wat voor standaard functies of libraries er zijn om daarmee te werken.
Daar is nou net zo'n BCL van .Net enzo heel handig voor ;)
drm schreef op donderdag 22 augustus 2013 @ 01:45:
Het is wel goed om te weten hoe je zoiets zelf zou kunnen berekenen
En daar ging 't uiteindelijk om; er is ook nergens gerept over zelf een paar duizend dagen bij "epoch" op te tellen en met schrikkeljaren en zomer/wintertijd te lopen ouwehoeren (en schrikkelsecondes en ga zo maar door). In the end zijn er gewoon date/time functies gebruikt.
drm schreef op donderdag 22 augustus 2013 @ 01:45:
maar het is nog beter om te weten waarom je dat beter niet zelf kunt doen.
Uiteraard.

Wat ik overigens misschien wel nog even had kunnen vermelden is dat je, uiteraard, gewoon 't beste FromOADate kunt gebruiken (wat DaoS ook al heeft aangegeven). Maar dan gaan we uit van .Net en Dava (TS) geeft alleen maar (lekker vaag) "Uiteindelijk moet ik de conversie in SQL zien te doen" aan. En daar heb je doorgaans weinig "libraries" in beschikbaar ;) Een:

    select cast(41504.785174 as datetime)

zit er 2 dagen langs (jeej, Excel/Office *O* ), een:

    select dateadd(s, 41504.785174 * 86400 , '1899-12-30');

gaat niet werken vanwege een int-overflow (dateadd verwacht een int voor de number parameter). En dan kom je al gauw op iets als:

    select dateadd(s, (@val - cast(@val as int)) * 86400, dateadd(d, @val, '1899-12-30'));

(waarbij @val een float van 41504,785174 is, of als placeholder dient voor de kolomnaam waar de waarde in staat).

Laten we wel wezen, 't grootste probleem zit 'm natuurlijk sowieso in, en begint dus bij, 't feit dat TS een waarde heeft (41504,785174) i.p.v. gewoon een datetime, datetime2 of datetimeoffset.

[ Voor 23% gewijzigd door RobIII op 22-08-2013 02:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1