Avatar billede klostermann Juniormester
25. august 2021 - 16:18 Der er 7 kommentarer

ISO 8601 datoer skal importeres til Access

Hej
Jeg har en CSV-fil med en masse data som jeg skal have læse ind i Access. CSV-filen opdateres jævnligt, så jeg lave det med en kæde.
I den CSV-fil er der nogle datoer som står som 2021-06-29T19:26:43+02:00. Det fejler umiddelbart og bliver ikke til en dato/tidspunkt i Access.
Jeg har prøvet at få lavet det om så det kom som 29-06-2021 19:26:43, men leverandøren af CSV-filen siger noget med ISO-8601...

Er der andre løsninger end:
- Jeg bearbejder data i CSV-filen før jeg indlæser
- Jeg indlæser feltet som tekst og får Access til at splittet feltet ad og samle det igen, og derefter gør det til en dato med DateValue

Håber at der endnu en gang er en der kan hjælpe mig :)

Anders
Avatar billede Gustav Ekspert
25. august 2021 - 16:35 #1
Du læser feltet som tekst.
Derefter kan du konvertere det til Date med fx denne funktion:

' Converts an ISO 8601 formatted date/time string to a date value.
'
' A timezone info is ignored.
' Optionally, a millisecond part can be ignored.
'
' Examples:
'  2029-02-17T19:43:08 +01.00  -> 2029-02-17 19:43:08
'  2029-02-17T19:43:08        -> 2029-02-17 19:43:08
'  ' IgnoreMilliseconds = False
'  2029-02-17T19:43:08.566    -> 2029-02-17 19:43:08.566
'  ' IgnoreMilliseconds = True
'  2029-02-17T19:43:08.566    -> 2029-02-17 19:43:08.000
'
' 2017-05-24. Gustav Brock. Cactus Data ApS, CPH.
'
Public Function CDateIso8601( _
    ByVal Expression As String, _
    Optional ByVal IgnoreMilliseconds As Boolean) _
    As Date

    Const Iso8601Separator  As String = "T"
    Const NeutralSeparator  As String = " "

    ' Length of ISO 8601 date/time string like: 2029-02-17T19:43:08 [+00.00]
    Const Iso8601Length    As Integer = 19
    ' Length of ISO 8601 date/time string like: 2029-02-17T19:43:08.566
    Const Iso8601MsecLength As Integer = 23
   
    Dim Value      As String
    Dim Result      As Date
   
    Value = Replace(Expression, Iso8601Separator, NeutralSeparator)
    If InStr(Expression, MillisecondSeparator) <> Iso8601Length + 1 Then
        IgnoreMilliseconds = True
    End If
   
    If IgnoreMilliseconds = False Then
        Result = CDateMsec(Left(Value, Iso8601MsecLength))
    Else
        Result = CDate(Left(Value, Iso8601Length))
    End If
   
    CDateIso8601 = Result
   
End Function


som du kan finde i modulet DateText her:
https://github.com/GustavBrock/VBA.Date
Avatar billede klostermann Juniormester
25. august 2021 - 18:50 #2
Så der er kun metode 2 at gøre det på?

Jeg skal bruge det i forespørgsel og ikke som VBA, så flækker selv noget sammen...
Avatar billede Gustav Ekspert
25. august 2021 - 19:07 #3
En funktion kan skam bruges i en forespørgsel.
Avatar billede klostermann Juniormester
25. august 2021 - 19:17 #4
Ikke af mig, for jeg ved ikke hvordan :)
Avatar billede Gustav Ekspert
25. august 2021 - 19:38 #5
Fx:

Select
    Felt1,
    Felt2,
    TextDato,
    CDateIso8601([TextDato], True) As Dato
From
    DinImportTabel


eller hvis du bare vil have en isoleret forespørgsel:

Select
    Felt1,
    Felt2,
    TextDato,
    CDate(Left(Replace([TextDato], "T", " "), 19)) As Dato
From
    DinImportTabel
Avatar billede Rune1983 Ekspert
26. august 2021 - 08:42 #6
Kunne du ikke bare importere din dato ind som string ... opret en ny kolonne i din tabel med date og anvend DateValue() funktion i et SQL kald som retter din date string til og gemmer i din nye kolonne.
Avatar billede Gustav Ekspert
26. august 2021 - 11:14 #7
DateValue kan ikke konvertere den uden videre, og hvis den kunne, ville tidskomponenten blive ignoreret.
CDate medtager tiden. Se ovenfor.
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