21. september 1999 - 19:36Der er
14 kommentarer og 1 løsning
binær værdi af et tal.
Jeg har et tal der repræsentere en dato 210999, dens binære værdi ved jeg er 36423, men hvordan finder man den binære værdi af et tal. Hvis nogen af jer også ved hvordan/eller om det kan gøres i vba ville det være fint, ellers laver jeg sgu bare en lille exe i c++ Hilsen Simon
hmmmm problemet er at tallet 210999 skal repræsentere en værdi der hedder 36423, når der så bliver når tallert så bliver 220999 skal værdien stige med en! Det er muligrt at det er en algoritme jeg mangler og ikke en eller anden værdi
Hvad pokker mener du med tallets binære værdi ??? Binært betyder to-tals system, så den binære værdi er noget i stil med hvad 127144146281 skriver ovenfor.
Er ønsket at du regner datoen om til en eller anden "fast" værdi, sådan at du kan lave alm. udregninger med + og - til en dato ??? I så fald HAR jeg en løsning.
Så vidt jeg kan se, så er det en datorutine du skal have fat i I VBA lagres alle dato og klokkeslet i et heltal. Prøv du at kigge på datorutinerne. Når du lagrer en dato i en variant type kan du se integer værdien.
Hej alle! jeg er klar over hvad binært betyder, men på det mainfraime anlæg jeg arbejder med til daglig, er der en funktion man kan bruge til omregning af dato til en tal værdi. Vi har på vores system en såkaldt "juliant date" det vil sige at . feks 210999 har en værdi der hedder 36423, hvis man så trækker 32957 som er starværdien for datosystemet fra, for man det tal jeg skal bruge, nemlig 3466, som er juliant date. Mit spørgsmål vedr. binært er fordi at funktioenen i en sql query stod som juliantdate=datevalue(date()-32957)denne query er taget fra en access database. håber i måske bedre forstår mit spørgsmål nu. ps. shjtip er når jeg er på arbejde shj er privat hjemmefra.
til Bjarke noget kunne tyde på at du har ret i at det er hexværdien jeg leder efter. please hvordan regner man så denne værdi ud for idag .feks 220999? bare lgie et hint ville være dejligt
Hvis du skal kunne regne & sammenligne på datoerne, kan du ikke lagre dem på formatet DMY (dag, måned, år) men SKAL derimod lagre dem på formatet CYMD (År inkl. århundre, måned & dag). Ser du - hvis du sammenligner 200999 med 191099, ja så er datoen i september jo størst, selvom datoen i oktober jo rent logisk kommer efter. Vender du den om, altså 19990920 og 19991019, så bliver checket korrekt.
Hvis du skal regne frem og tilbage på datoerne er det nemmeste at lave rutiner til dette (VBA syntaksen kender jeg ikke, men det skulle vel være en smal sag at oversætte C til BASIC):
inline int LeapYearAdjust(int Year) { if ((Year % 4) == 0) /* Leap year. */ return 29;
return 28; };
/*****************************************/ ulong MakeDate(ulong Date, int NewDays) /*****************************************/ { /* Setoff, Jan,Feb,Mar,Apr,Maj,Jun,Jul,Aug,Sep,Oct,Nov,Dec. */ int MaxDay[13] = { 0 , 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int Year, Month, Day; /* Extract day from date and in-/decrease it. */ Year = (int)(Date / 10000L); Month = (int)(Date % 10000L) / 100; Day = (int)(Date % 100) + NewDays; MaxDay[2] = LeapYearAdjust(Year);
/* If new date smaller than 1, select previous month, if greater */ /* than max date in month, selected next month. */ if (Day < 1) { /* Older date. */ while (Day < 1) { Month--; if (Month < 1) { Year--; Month = 12; MaxDay[2] = LeapYearAdjust(Year); }; Day += MaxDay[Month]; /* Add last date of previous month. */ }; } /* Older date. */ else { /* Newer date. */ while (Day > MaxDay[Month]) { Day -= MaxDay[Month]; /* Subtract max date of current month. */ if ((++Month) > 12) { Year++; Month = 1; MaxDay[2] = LeapYearAdjust(Year); }; }; }; /* Newer date. */
For at få hex-værdien for idag, skal du først regne dagsdato om til julian date, helt analogt til d.o.:
int juliandate(int dato) { int maxDay[13] = { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; int year = dato / 10000; int month = (dato % 10000) / 100; int day = dato / 100; maxDay[2] = LeapYearAdjust(year);
return year * 10000 + maxDay[month] + day; }
herefter sender du den bare igennem sprintf(sqltext, "%0X", juliandate(dato)). Hvis du også skal lave det selv, kan du f.eks. gøre det sådan her:
char * inttohex(int val) { // Static for at gøre den hurtigere, da den sikkert bliver kaldt flere gange. static char str[21]; static int idx, tmpval; idx = 0; tmpval = val; while (tmpval) { if ((tmpval % 16) > 10) str[idx] = 'A' + (tmpval % 16) - 10; else str[idx] = '0' + (tmpval % 16); idx++; tmpval /= 16; }; if (idx > 0) { str[idx] = '\x0'; return str; } else return "0"; }
VBA-syntaksen kender jeg ikke, men du kan sikkert selv oversætte.
soepro >> hvis du mangler en mand i firmaet, så sig til. Hvis man virkelig har SÅ meget tid til at lege på eksperten, så må det da være et drømmejob;-)
soepro tak for dine gode svar, jeg har ikke brugt dem direkte, men de har inspireret mig til en løsning der kan bruges i visual basic samtidig med at jeg har lært noget om datoer i c++ det er jo netop det der gør svar fra prof udviklere så lærerige. Du for point når jeg kommer på arbejde, kan ikke acceptere svar hjemmefra da jeg skrev spørgsmålet på arbejdet Hilsen Simon
Jeg må nok også hellere få egen virksomhed, "når jeg bliver stor" ;-)
Synes godt om
Ny brugerNybegynder
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.