Probleme mit "Teil"-Funktion

Alex777

Mitglied
Hallo zusammen,

ich habe in einer Abfrage die Funktion "Teil" zum zerlegen eines Strings. Das hat auch bisher immer funktioniert. Bis ich dann heute die DB öffnete, die Abfrage exportierte und mich über das Ergebnis wunderte.

Im Moment lautet die Abfrage

SQL:
SELECT StempelzeitenRohformat.Schlüssel, 
"" AS Ausdr4, 
"20" & Left([DatumUhrzeit],2) & Mid([DatumUhrzeit],3.2) & "-" & Mid([DatumUhrzeit],5.2) AS Datum, 
Mid([DatumUhrzeit],7.2) & ":" & Mid([DatumUhrzeit],9.2) & ":00" AS Uhrzeit, 
Left("0000000000",10-Len([Chipkarte])) & [Chipkarte] AS Chip
FROM StempelzeitenRohformat;

Als Ergebnis für "Mid([DatumUhrzeit],3.2)" schmeißt er aber nun den ganzen String ab Zeichen Nummer 3 raus und nicht nur die 2 verlangten Zeichen. Laut Access-Hilfe zur Funktion "Mid" passiert das wenn die Länge des Werts die Zeichenfolge überschreitet... Die Zeichenfolge hat aber 10 Zeichen...

Das gilt im Übrigen auch für alle anderen Mid-Funktionen in dieser Abfrage.
Das Feld "DatumUhrzeit" ist z.Zt. als Kurzer Text formatiert.

Gruß, Alex
 
Bevor wir ans Werk gehen. Wir ignorieren mal dein SQL.
Was kommt als welchen Datentyp in welchem Format daher: Ein Datum-Zeitfeld formatiert
Was soll daraus gemacht werden: Das Datum und die Uhrzeit extrahieren. Als Datum/Zeit oder als Text.

Bitte gib das genaue Format deines Quellfeldes an. Am besten mit Beispielen.
Die AUsgabe. Als Datum/Zeit oder als Text? Falls zweiteres. Welches Format?
Dann kann ich mal schauen, wie man da eine robustere Struktur hinbekommt

Nachtrag:
Dein MID() und auch die anderen Befehle sind etwas komisch.
SQL:
Mid([DatumUhrzeit],3.2)
-- Sollte wohl eher so lauten
Mid([DatumUhrzeit], 3, 2)
Ich würde aber trotzdem das ganze überabreiten
 
Also, meine Stempeluhr erstellt eine Textdatei mit den Stempelsätzen. Aus dieser importiere ich die Tabelle "StempelzeitenRohformat".
In dieser Tabelle hat das Feld "DatumUhrzeit" das Format "kurzer Text"
Ein Beispiel für einen Wert aus diesem Feld ist: "1801220532" (22.01.18 05:32)

Dieser Wert muss nun für mein Zeiterfassungsprogramm in ein Feld "Datum" mit dem Format jjjj-mm-tt und in ein Feld "Uhrzeit" mit dem Format "hh:mm:ss" zerteilt werden.
 
Wie ich dein SQL lesen, hast du das ganze im Format YYMMDDHHNN.
Wenn es sich nicht gerade um hunderttausende Datensätze handelt, kannst du auch meine Funktion strToDate() verwenden

Test im Direktfenster
Visual Basic:
?strToDate("1801301131", "yymmddhhnn")
30.01.2018 11:31:00
im SQL könnte das so umgesetzt weren
SQL:
SELECT
  -- Datum mit Uhrzeit berechnen
  strToDate([DatumUhrzeit], 'yymmddhhnn') as datum_zeit,
  -- Datum herauslösen
  dateValue([datum_zeit]) AS Datum,
  -- Zeit herauslösen
  timeValue([datum_zeit]) AS Uhrzeit,
  ...


Nachtrag:
Deien Lösung stimmt fast. Aber eben, anstelle von 3.4 sollte es 3, 2 heissen
 
Zuletzt bearbeitet:
Achja, meine Funktion strToDate() ist natürlich recht gross und nicht besonders schnell, dafür sehr flexibel.
Man kann sich aber recht einfach mittels Regulären Ausdrücken eine massgeschneiderte Funktion schreiben
Visual Basic:
Public Function toDate(ByVal iString) As Date
    Static rx As Object
    If rx Is Nothing Then
        Set rx = CreateObject("VBScript.RegExp")
        rx.pattern = "^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$"
    End If
    toDate = CDate(rx.replace(iString, "20$1-$2-$3 $4:$5:00"))
End Function
Test im Direktfenster
Visual Basic:
?ToDate("1801301131")
30.01.2018 11:31:00
 
Ah vielen Dank, mit der Funktion toDate klappt es perfekt.

Hier nochmal die SQL Abfrage wie ich sie aktuell verbaut habe:

SQL:
SELECT StempelzeitenRohformat.Schlüssel, 
"" AS Ausdr4, 
toDate([DatumUhrzeit]) AS datum_zeit, 
DateValue([datum_zeit]) AS Datum, TimeValue([datum_zeit]) AS Uhrzeit, 
Left("0000000000",10-Len([Chipkarte])) & [Chipkarte] AS Chip
FROM StempelzeitenRohformat;

Problem ist jetzt nur dass ich die Spalte datum_zeit in der Abfrage habe, diese aber im Export in der .csv Datei nicht möchte.
Habe nun über Ausblenden versucht aber das klappt leider nicht so einfach.
 
Entweder noch ein SQL darüber oder ganz weglassen. Dazu einfach die [Datum_zeit] in den Folgeberechnungen durch die Formel ersetzen
SQL:
SELECT StempelzeitenRohformat.Schlüssel,
  "" AS Ausdr4,
  DateValue(toDate([DatumUhrzeit])) AS Datum,
  TimeValue(toDate([DatumUhrzeit])) AS Uhrzeit,
  LEFT("0000000000",10-Len([Chipkarte])) & [Chipkarte] AS Chip
FROM StempelzeitenRohformat;

Achja, auch für den Chip empfehle ich dir eine Funktion
Visual Basic:
'/**
' * Gibt den String iString zurück. Dieser wurde nach rechts mit dem String iPadString auf eine Länge von iLen Zeichen aufgefüllt.
' * Wenn iString länger als iLen ist, wird der Rückgabewert auf iLen Zeichen gekürzt.
' * @param  String
' * @param  Integer     Neue Länge
' * @param  String      Zeichen mit dem verlängert wird
' * @return Erweiterter oder gekürzter String
' */
Public Function rPad( _
        ByVal iString As String, _
        ByVal iLen As Integer, _
        Optional ByVal iPadString As String = " " _
) As String
    rPad = Right(iString, iLen)
    rPad = String(iLen - Len(rPad), iPadString) & rPad
End Function
SQL:
SELECT StempelzeitenRohformat.Schlüssel,
  "" AS Ausdr4,
  DateValue(toDate([DatumUhrzeit])) AS Datum,
  TimeValue(toDate([DatumUhrzeit])) AS Uhrzeit,
  rPad([Chipkarte], 10, "0") AS Chip
FROM StempelzeitenRohformat;
 
Vielen Dank, funktioniert und ist wesentlich eleganter als vorher!!

EDIT: Letzte Problem ist noch das Datumsformat. Ich traue mich nicht in deiner Funktion etwas zu ändern.

Es wird im Moment im Format : "tt.mm.jjjj." ausgeben, meine Software kann aber nur "jjjj-mm-tt" verarbeiten.

Gruß
 
Dann noch ein Format rein hängen, damit du nachher ein String in deinem Format hast
SQL:
SELECT StempelzeitenRohformat.Schlüssel,
  "" AS Ausdr4,
  Format(DateValue(toDate([DatumUhrzeit])), "YYYY-MM-DD") AS Datum,
  TimeValue(toDate([DatumUhrzeit])) AS Uhrzeit,
  rPad([Chipkarte], 10, "0") AS Chip
FROM StempelzeitenRohformat;
 
Zurück