10. november 2010 - 12:20 Der er 32 kommentarer og
1 løsning

Dato formater ddmmyyyy eller mmddyyyy i Access 2007

Jeg eller mit system roder rundt.  Jeg har en tabel 'Tilstede' med blandt andet feltet 'dato' med datatype Datetime.  Oplysninger kan indfoeres enten direkte i tabellen eller gennem en formular med et textfelt txtDatum og dette vbakode-udsnit:

Dim d AS Date
d = Me.txtDatum
Docmd.RunSQL "INSERT INTO Tilstede VALUES(#" & d & "#))"   

Hvis jeg direkte i tabellen vil indfoere en begivenhed 10 november 2010 skriver jeg i feltet 10-11-2010, og saaledes bliver det staaende.  Men hvis jeg vil finde det tilbage med query SELECT * FROM Tilstede WHERE dato = #10-11-2010# faar jeg et tomt resultat.  Jeg skal soege SELECT * FROM Tilstede WHERE DATO = #11-10-2010#. Hvis jeg i formularen indfoerer 10-11-2010 kommer der i tabellen til at staa 11-10-2010.

(Min Microsoft Office pakke er paa hollandsk.  I Holland bruger man samme datonotering som i Danmark, altsaa ddmmyyyy.)

Hvordan opnaar jeg at brugeren kan indfoere for eksempel 10 november 2010 som 10-11-2010 i formularen og at det vises i tabellen som 10-11-2010 og kan soeges med ....#10-11-2010#?
Avatar billede neoman Novice
10. november 2010 - 12:44 #1
10. november 2010 - 13:16 #2
neoman, jeg har netop studeret dette spoergsmaal i detaljer og soegt deri, i det link den viser, og videre paa Google.  Der forklares at datoer gemmes internt som mmddyyyy (og det var nyttigt for mig at forstaa hvad der gik for sig.)  Videre gives der anvisninger paa hvordan man ved formattering kan traekke datoer ud og benytte dem. 

Men jeg fandt ikke noget svar paa mit centrale problem:  Givet at 10 november 2010 bevares internt som 11-10-2010 hvordan kan jeg arrangere det saaledes at jeg (1) i formularen kan indfoere 10-11-2010 og saa faa 10-11-2010 vist i tabellen, og (2) at jeg kan traekke dataer om 10 november ud ved en query SELECT .... #10-11-2010#.

Jeg har proevet at indsaette formatteringen i vba koden saa 10-11-2010 i tabellen bliver vist som 10-11-2010, men et problem er jo saa at med formattering bliver datoen til en streng og jeg faar datatypemismatches.

neoman (og andre) hvordan skal jeg gribe det an?  Hvis svaret ligger skjult (for mine oejne) i det citerede spoergsmaal saa forklar venligst.
Avatar billede neoman Novice
10. november 2010 - 13:31 #3
Datoer optræder in DB'en mmddyyyy - uafhængigt af locale.

Datoer bliver VIST, afhængigt af locale. Når du kigger på en tabel så er datovisningen formatteret efter locale. Visning/formattering har ikke nogen indflydelse på den interne værdi.

Når du skriver en SQL-string, så skal du tale SQL - og der er datoer mmddyyyy.

"Jeg har proevet at indsaette formatteringen i vba koden saa 10-11-2010 i tabellen bliver vist som 10-11-2010, men et problem er jo saa at med formattering bliver datoen til en streng og jeg faar datatypemismatches." Ikke forstået. DU kan ikke ændre tabellens visning af datoer i VBA (medmindre du laver noget om på feltformatet i TabelDefs - så hvad mener du der?

Når du tilføjer en dato vha en SQL-sætning så skal det du fisker op i din tekstbox skrives "#mm/dd/yyyy#" i SQL-sætningen - og det er lige hvad FORMAT funktionen gør i det linkede eksempel.
Avatar billede terry Ekspert
10. november 2010 - 15:44 #4
try formatting the date yyyy-mm-dd in your SQL
Avatar billede terry Ekspert
10. november 2010 - 15:46 #5
Datoer optræder in DB'en mmddyyyy - uafhængigt af locale.

Actually you will find it is in a totally different format.
Avatar billede neoman Novice
10. november 2010 - 15:56 #6
@Terry

You are quite right -  a real number, where the part before the decimal corresponds to date and the decimal part to time. But for the sake of this discussion? :-)
Avatar billede terry Ekspert
10. november 2010 - 16:25 #7
But for the sake of this discussion

Yes your also right, no matter what the langauge settings are the format in the dB is always the same.

Language settings effect only the visual format.
10. november 2010 - 16:41 #8
terry, I have googled that date-times are represented internally as a decimal number where the integer part represents the number of days that have passed since a date about 1890 and the decimal part represent the time as fractions of a day.  If I enter an event for 10 november 2010 then the system will, in principle, calculate how many days have passed since the start date in 1890 and store the date as that number.  If I then enter an SQL query such as 'SELECT name, date FROM table1 WHERE date = [10 november 2010] the system will convert 10 november 2010 to an integer, retrieve dates stored under that integer, for presentation purposes convert the integer back to [10 november 2010].  (If I am totally wrong,tell me.)

Danish now:  neoman og terry, mit spoergsmaal gaar saa paa hvordan systemet beslutter efter hvilke regler det vil convertere fra en dato som indfoert til denne integer og tilbage.  neoman, siger du at uanset om man er i en locale der bruger ddmmyyyy saa vil systemet for en input som 10-11-2010 altid beregne antal dage indtil elfte oktober, ikke tiende november?  Det lyder da i grunden maerkeligt, hvad er locale indstillingerne saa til?  Er det maaske mig der har de forkerte locale instillinger?  I saafald, hvordan retter jeg dem?  Man burde i grunden i kunne stole paa at naar man i tabel ser 10-11-2010 saa representerer det 10 november og naar man i en formular indfylder 10-11-2010 saa bliver den bevaret som tiende november og indfoert i tabellen som 10-11-2010.

Hvis det nu er forkert og hvis man vil give brugerne lov til i formularen at indfylde tiende november som de er vant til, hvordan vender man i vba saa dd og mm om saa systemet rent faktisk bevarer det som tiende november?  Jeg proevede, ifoelge de naevnte link, dette:

Dim d As Date
d = format(Me.txtDatum, \#mm\/dd\/yyyy\#)

men jeg faar med det samme compilerfejl, expects expression.  Jeg proevede mig frem til at d = Format(Me.txtDatum, mmddyyyy) ikke gav compilerfejl, men da jeg testede det og indfoerte 10-11-2010 blev det igen slaaet op i tabellen som 11-10-2010.

Saa jeg har (endnu en gang) saerdeles brug for hjaelp til at faa det til at virke.
Avatar billede neoman Novice
10. november 2010 - 16:54 #9
Jeg tror du er forvirret: visning har intet med interne datoer at gøre. Locale indstillinger justerer alene VISNINGEN. PÅsamme måde som når du sætter 0-decimaler i et format for et tal, så betyder det jo ikke, at data bliver kappet - kun ikke VIST.

Når du skriver SQL selv, skal du enten skriver mm/dd/yyy eller som terry foreslår yyyy/mm/dd

DIn SQl skal derfor se sådan ud

mySQLstring= " ..... minSøgeDato=" & Format(Me.txtDato, "\#mm\/dd\/yyyy\#") & "andre kriterier...."

Systemet konverterer alene VISNINGER efter locale-settings. Det øjeblik du skriver en dato ud som string, og det gør du i fx sql-strengen overfor, så er det dig selv som skal sørge for det rigtige format.

Nu er Access lidt brugervenlig, så datoer som 11-Aug-2010 VIL blive opfattet rigtigt, lige så som 13/8/2010 - men altså ikke 12/8/2010.
10. november 2010 - 16:55 #10
Two inputs came while I was working on mine.  Internal storage always the same, language settings effect only the visual result.  No problem with that, but language settings should hopefully also effect the visual input so that with a Danish/Belgian setting the visual input 10-11-2010 should be interpreted as 10 november and stored accordingly.  That is where I cannot follow.
Avatar billede neoman Novice
10. november 2010 - 16:57 #11
"men da jeg testede det og indfoerte 10-11-2010 blev det igen slaaet op i tabellen som 11-10-2010."

øh - du må være lidt mere specifik: hvis du skriver 10-11-2010 i din SQL streng, så svarer det til den dato, som efter vores locale vises som 11-10-2010 - så det er jo rigtigt. Og det er også den dato du vil se, hvis du bare åbner tabellen og kigger på værdierne (altså hvis du har shortdate format, og du ellers har hollandsk locale på)
Avatar billede neoman Novice
10. november 2010 - 16:59 #12
hvad er "visual input"???
Avatar billede terry Ekspert
10. november 2010 - 18:32 #13
If you convert the date to ISO date format then you shouldnt have any problems

YYYY-MM-DD


Actually I think (getting old) in SQL the US date format is standard MMDDYYYY but using the ISO format gets round this
10. november 2010 - 18:50 #14
neoman, jeg arbejder som frivillig paa et velfaerdscenter der blandt andet organiserer aktiviteter i grupper.  Centeret faar tilskud fra forskellige myndigheder som saa vil have rapporter over aktivitererne.  Lederne af de forskellige grupper noterede sig tilstedevaerelsen paa vidt forskellige maader, nogle med haanden i en kalender, andre paa excell spreadsheads, og andre slet ikke.  Naar saa rapporterne skulle ud var der en masse arbejde, isaer hvis en myndighed pludselig ville have yderligere oplysninger saa som en graf over udviklingen i deltagelse det forloebne aar.  Jeg lavede saa en tabel med tre kolonner, gruppe, dato, og person.  Fra saadan en tabel, hvis fyldt ud, skulle alle mulige statistikker og grafer kunne produceres.  Til at begynde med fyldte jeg selv tabellen ind med data jeg fandt, for eksempel Boernegruppe1, person1, 12-5-2010 (hvormed jeg mente 12 maj 2010.)  Men saa udviklede jeg en formular til at medarbejderne kan indfoere oplysningerne.  Medarbejderne vaelger en gruppe og en dato.  Der aabnes saa en ny formular med en liste af medlemmerne af den valgte gruppen og to tekstboxe, en med gruppens navn og en med den valgte dato. 

Hvis ingen dato vaelges bliver dags dato fyldt ind.  VBA: txtDatum = IIf(IsDate(Me.txtDatoTilstede), Me.txtDatoTilstede, Date. Hvis for eksempel idag ingen dato var fyldt ind ville txtDatum vise 10-11-2010. 

Medarbejderen kan saa fra medlemslisten vaelge de medarbejdere der var tilstede den paagaeldende dag.  Medarbejderen klikker saa paa en submitknop, og tabellen fyldes ud  - i pseudokode:  for hver person selected i listen indsaet i tabellen (gruppe, dato, person) vaerdierne (den valgte person, datoen fra den foerste tekstbox, gruppenavnet fra den anden tekstbox.)

Fordi brugeren kan se datovaerdien i tekstboxen kaldte jeg det visuelt input.  Jeg ville saa have forventet at 10-11-2010 i tekstboxen skulle resultere i at tabellen viser 10-11-2010.  Isaer fordi Date resulterer i 10-11-2010.  Men den indfoerte record i tabellen viser 11-10-2010. 

vba koden for onclick eventen hvad angaar datoen er, som naevnt ovenfor, denne:

Dim d as Date
d=Me.txtDatum
[for hver person valgt]
DoCmd.RunSQL "INSERT INTO tblTilstede(gruppe, dato, person) VALUES( [id nummer for den valgte person], # & d & #, [gruppenavnet])

Som sagt resluterer det i at datoen i tekstfeltet 10-11-2010 dukker op i tabellen som 11-10-2010.  For saa at proeve at formattere datoen som diskuteret aendrede jeg fra d=Me.txtDatum til d = Format(Me.txtDatum, mmddyyyy) og koerte resten af koden uaendret.  Men det aendrede ingenting, 10-11-2010 vises stadig i tabellen som 11-10-2010.

Jeg ved ikke om du i dit system har tabeller med datoer som du fylder ind via formularer, men hvis du skulle indfoere 10 november 2010 hvad ville du saa fylde i tabellens textbox?  Og ville du forvente at tabellen skulle vise noget andet end det du indfylder i formularen?

Under alle omstaendigheder vil jeg ikke til at laere medarbejderne, naar de mener 10 november 2010, saa at indfoere 11-10-2010.  Det maa vaere et spoergsmaal om at laere systemet at fortolke 10-11-2010 som 10 november 2010 og gengive det som 10-11-2010 i tabellen.

Eller er det mig der er tosset?
Avatar billede neoman Novice
10. november 2010 - 18:54 #15
@Terry

Our "date victim" seems confused when to do conversions and when not to, no matter the format.

The point is that whenever you input the value of a date in a string (VBA or the query design grid), you need to feed it either as mmddyyyy, or some other unambiguous format, like eg yyyymmdd

If you let the system take care of it, eg if a date value is in a textbox BOUND to a date in a record, the system takes care of stuffing the right date in the right fashion into the database, taking into account the locale setting to go from what the user typed to what the db understands.
Avatar billede terry Ekspert
10. november 2010 - 18:56 #16
Using textboxes for entering date values isnt a good idea. If you can use a calender control you can be sure that the date is correct.
Avatar billede neoman Novice
10. november 2010 - 19:01 #17
Jeg har brygget på adskillige systemer, og fulgt det med at systemet tager vare på det, når der ikke forligger nogen ouput til string, og i sql, så konvereterer jeg til mmddyyyy, og det har altid virket fint.

Når du skriver at uanset om du formaterer datoen som mmddyyyy eller ddmmyyyy i din SQL-sætning, så får du det samme i db'en, lyder ret underligt. Er du 100% sikker?
Avatar billede neoman Novice
10. november 2010 - 19:02 #18
Alternatvit - prøv Terrys forslag, og lave formatet i din sql-streng  om til yyyymmdd - så skulle der ikke være tvivl :-)
Avatar billede neoman Novice
10. november 2010 - 19:04 #19
@Terry - you are not on Access 2007 are you? -) In 2007, when a txtbox format is set to Date, there is an automatic little icon with a calendar pop-up - saves you the hassle with a separate calendar control.
Avatar billede terry Ekspert
10. november 2010 - 19:09 #20
Yes I have Access 2007 and I know about the calender pop-up but I'm not sure if thats going to help if the format in the box is still mm-dd-yyyy and Christian then tries using this in an SQL.
Avatar billede neoman Novice
10. november 2010 - 19:13 #21
The basic issue is the conversion - so all inputs expressed as strings need to be converted - even if he picked up the value from a calendar control, if he wants to stuff it into an sql-string, I bet my posterior that he would have to convert it anyway :-)
10. november 2010 - 19:20 #22
Sikke en aktivitet jeg fik sat i gang.  Jeg er smigret.

terry, #16, I use a calender control to enter a date in the form textbox from where it goes to the table.  I shall now experiment with placing the calender control in the formular and se if that makes a different.

neoman #17, jeg faar samme resultat, at 10-11-2010 fra formularens textbox dukker op i tabellen som 11-10-2010, ved disse to koder:

Dim d as Date
d=Me.txtDatum
[for hver person valgt]
DoCmd.RunSQL "INSERT INTO tblTilstede(gruppe, dato, person) VALUES( [id nummer for den valgte person], # & d & #, [gruppenavnet])

og

Dim d as Date
d = Format(Me.txtDatum, mmddyyyy)
[for hver person valgt]
DoCmd.RunSQL "INSERT INTO tblTilstede(gruppe, dato, person) VALUES( [id nummer for den valgte person], # & d & #, [gruppenavnet])

Det kan for eksempel ligge i at syntaksen Format... er forkert.  Men saa er jeg lidt fortabt med hensyn til hvad den skal rettes til.
Avatar billede neoman Novice
10. november 2010 - 19:21 #23
The format in the textbox is set by the locale, and so is all output of dates to string.  I really cannot see the problem: you pick up the date from the textbox, use FORMAT to spit out either mmddyyyy or yyyymmdd or dd-mmm-yyyy (and FORMAT knows, from the locale-setting, what was meant in the textbox) and plug the result into the sql-string.
Avatar billede neoman Novice
10. november 2010 - 19:25 #24
output fra FORMAT er en string !! ikke en dato !

prøv

DoCmd.RunSQL "INSERT INTO tblTilstede(gruppe, dato, person) VALUES( [id nummer for den valgte person], Format(d,"\#mm\/dd\/yyyy\#" ), [gruppenavnet])
Avatar billede neoman Novice
10. november 2010 - 19:29 #25
altså:

DoCmd.RunSQL "INSERT INTO tblTilstede(gruppe, dato, person) VALUES( [id nummer for den valgte person], Format(Me.txtDatum,"\#mm\/dd\/yyyy\#" ), [gruppenavnet])
10. november 2010 - 19:32 #26
neoman, the problem could easily be lie in my lower level of knowledge. d = Format(Me.txtDatum, mmddyyyy) seems to make no difference from d=Me.txtDatum.  How should I change it?
10. november 2010 - 19:32 #27
Igen krydsende indlaeg.  Jeg proever lige #25 af.
10. november 2010 - 19:46 #28
neoman, umiddelbart giver din kode #26 compilerfejl.  Jeg realiserer mig at jeg allerede har proevet den, taget fra den traad du henviste til.

Men jeg har nu konstateret at der (desvaerre) ikke er fundet en nem patentloesning paa problemet.  Og saa har jeg faaet en masse indput som jeg lige skal proeve af i mit eget (langsomme) tempo.  Det kan sagtens tage et par timer.  Jeg ville vaere glad for, til den tid, at kunne komme tilbage.
Avatar billede neoman Novice
10. november 2010 - 19:50 #29
DoCmd.RunSQL "INSERT INTO tblTilstede(gruppe, dato, person) VALUES( [id nummer for den valgte person], Format(Me.txtDatum,""\#mm\/dd\/yyyy\#"" ), [gruppenavnet]) "
Avatar billede neoman Novice
10. november 2010 - 19:52 #30
sludder

DoCmd.RunSQL "INSERT INTO tblTilstede(gruppe, dato, person) VALUES( [id nummer for den valgte person], " & Format(Me.txtDatum,"\#mm\/dd\/yyyy\#" ) & ", [gruppenavnet]) "
Avatar billede MNS Nybegynder
10. november 2010 - 23:22 #31
Hej
Du ved at dato er afhæ. af server og du kan selv ændre på den og her er en eksampel

<%
Function DanskDatoTid(dato)

  ' danske navne på dage
  arrDag = ",mandag,tirsdag,onsdag,torsdag,fredag,lørdag,søndag"
  arrDag = Split(arrDag,",")

  'navne på måneder
  arrMaaned = ",januar,februar,marts,april,maj,juni,juli,august,"
  arrMaaned = arrMaaned & "september,oktober,november,december"
  arrMaaned = Split(arrMaaned,",")

  DanskDatoTid = arrDag(Weekday(dato,VbMonday)) & "  " & Day(dato) & ". "
  DanskDatoTid = DanskDatoTid  & arrMaaned(Month(dato)) & " " & Year(dato)
  DanskDatoTid = DanskDatoTid  & " kl. " & FormatDateTime(dato, vblongTime)

End Function

Response.Write DanskDatoTid(Now)
%>
Jeg håber kan hjælpe .Jeg læste den i den hjemmeside.
http://www.html.dk/tutorials/asp/lektion4.asp
11. november 2010 - 06:42 #32
Saa fik jeg det til at virke!  neoman, syntaksen i #30 var den rigtige, det var bare en nattesoevn der manglede.  (Det sidste problem i aftes var at jeg slet ikke fik output, hverken med forkert eller med rigtig dato.  Da besluttede jeg at sove paa det.  Problemet var ganske enkelt at jeg havde kommenteret linien ud mens jeg arbejdede med den og saa glemt at kommentere den ind igen.)  Tak for hjaelpen og din taalmodighed.  Opretter du et svar?

Men det betyder saa at alle de entries jeg har lavet direkte i tabellen hvor dagen er mindre end 13 nu skal laves om!  Og hvad vaerre er, foedselsdagene i persontabellen er alle indsat direkte i tabellen.  Det maa jeg vist sove endnu en nat paa og saa proeve at designe en 'clever' query dertil. Der dukker nok et spoergsmaal eller to op om det foer jeg faar det paa plads.

Terry, also thanks for the effort.  I subsequently tested neoman's syntax with your suggestion yyyy-mm-dd.  That also works, and I find it more pallatable.  60 points are too few to share after such a busy thread.  I shall set up a new question with "points to terry."

MNS, tak for interessen.  Imidlertid foreslaar du loesning paa et andet problem end det jeg stillede.
Avatar billede neoman Novice
11. november 2010 - 08:31 #33
ok godt det lykkedes. Gad vide om #29 ikke ville fungere alligevel?
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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



IT-JOB

Udviklings- og Forenklingsstyrelsen

Data Engineers til bekæmpelse af skatteunddragelse

Udviklings- og Forenklingsstyrelsen

Projektledere til nyetableret PMO-kontor

Udviklings- og Forenklingsstyrelsen

Webanalytiker til digitale løsninger

Politiets Efterretningstjeneste

Bliv AD-specialist hos PET