Forum

Forum (https://www.ms-office.gr/forum/)
-   Access - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/)
-   -   [ Ερωτήματα ] Πρόβλημα με ημερομηνία σε sql ερώτημα (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/5455-problima-me-imerominia-se-sql-erotima.html)

Dimitriss 11-02-20 01:40

Πρόβλημα με ημερομηνία σε sql ερώτημα
 
Καλημέρα στην κοινότητα. Θα ήθελα την βοήθειά σας. Έχω το παρακάτω sql ερώτημα:
Κώδικας:

sql = "SELECT * FROM ΠΙΝΑΚΑ" _
        & " WHERE ΠΕΔΙΟ_Α= '" & cntro & "' AND" _
        & " ΠΕΔΙΟ_Β='" & kdkos & "' AND ΠΕΔΙΟ_Γ='" & eds & "' AND" _
        & " ΠΕΔΙΟ_Δ='" & tm & "' AND ΗΜΕΡΟΜΗΝΙΑ= #" & Format(DDate, "dd/mm/yyyy") & "#"

Το ερώτημα δεν λειτουργεί σωστά όταν έχω την ημερομηνία. Όταν διαγράφω την ημερομηνία τρέχει μία χαρά. Ο τύπος της ημερομηνίας στη βάση μου είναι Ημερομηνία/Ώρα.
Συντακτικά δε βλέπω κάποιο λάθος. Έχει κάποιος φίλος κάποια ιδέα τι μπορεί να φταίει;
Επίσης έχω δοκιμάσει και αυτή την εκδοχή αλλά και πάλι χωρίς αποτέλεσμα.
Κώδικας:

sql = "SELECT * FROM ΠΙΝΑΚΑ" _
        & " WHERE ΠΕΔΙΟ_Α= '" & cntro & "' AND" _
        & " ΠΕΔΙΟ_Β='" & kdkos & "' AND ΠΕΔΙΟ_Γ='" & eds & "' AND" _
        & " ΠΕΔΙΟ_Δ='" & tm & "' AND ΗΜΕΡΟΜΗΝΙΑ= DateValue(DDate) & "#"

Σημ. Όλες οι μεταβλητές είναι κανονικά δηλωμένες με τους σωστούς τύπους, ενώ η DDate είναι τύπου string.
Ευχαριστώ.

Meteora 11-02-20 18:59

Καλησπέρα
Παράθεση:

Όλες οι μεταβλητές είναι κανονικά δηλωμένες με τους σωστούς τύπους, ενώ η DDate είναι τύπου string
.
Η ημερομηνία δεν είναι string, αλλά τύπου date. Τι σε απαντάει access όταν ρωτάς -εκεί στο Immediate παράθυρο
Κώδικας:

Format(DDate, "dd/mm/yyyy")
;

Εδώ να εστιάσεις την προσοχή σου.

Tasos 11-02-20 19:12

Καλησπέρα σε όλους!

Δημήτρη στην SQL, η ημερομηνία σ' αυτή τη μορφή: "d/m/yyyy" δεν αναγνωρίζεται σωστά.

Δοκίμασε:

Κώδικας:

sql = "SELECT * FROM ΠΙΝΑΚΑ" _
        & " WHERE ΠΕΔΙΟ_Α= '" & cntro & "' AND" _
        & " ΠΕΔΙΟ_Β='" & kdkos & "' AND ΠΕΔΙΟ_Γ='" & eds & "' AND" _
        & " ΠΕΔΙΟ_Δ='" & tm & "' AND ΗΜΕΡΟΜΗΝΙΑ= #" & Format(DDate, "m\/d\/yyyy") & "#"

Καλή συνέχεια!

Τάσος

Dimitriss 11-02-20 22:35

Σας ευχαριστώ για τις απαντήσεις σας. Το πρόβλημα λύθηκε μετατρέποντας την ημερομηνία στην μορφή yyyy/mm/dd., δηλαδή
Format (DateValue(DDate), "yyyy/mm/dd").

Tasos 11-02-20 23:29

Αγαπητέ Δημήτρη θέλω αρχικά να με συγχωρέσεις για την παρέμβαση μου.

Δεν το συνηθίζω αλλά η ορθότητα της λύσης το επιβάλλει.
.
Η μορφή "m/d/yyyy" ή για περισσότερη συμβατότητα "m\/d\/yyyy" λειτουργεί στην SQL ακριβώς όπως η "yyyy/mm/dd" ή η "yyyy/m/d".

Πές μου αν θέλεις: Γιατί χρησιμοποιείς την DateValue ??

Θα είχε νόημα να τη χρησιμοποιήσεις αν το πεδίο DDate είναι τύπου κειμένου και όχι ημερομηνίας.

Αν όντως είναι έτσι, οφείλω να αναφέρω ότι ακόμα και αν λύθηκε το πρόβλημα σου, δεν μπορεί κανείς να στηριχτεί στη συναρτηση DateValue που άλλα δείχνει σε αγγλοαμερικανικό υπολογιστή και άλλα στον ελληνικό.

Τι εννοώ:

Σε υπολογιστή με αγγλική(USA) μορφή ημερομηνίας η DateValue("12/1/2020") θα επιστρέψει 1 Δεκεμβρίου 2020
ενώ υπολογιστή με ελληνική μορφή ημερομηνίας η DateValue("12/1/2020") θα επιστρέψει 12 Ιανουαρίου 2020

Αν πάλι το πεδίο DDate είναι τύπου ημερομηνίας η DateValue δεν χρειάζεται.

Ευχαριστώ

Με εκτίμηση

Τάσος

Dimitriss 13-02-20 22:24

Αγαπητέ Τάσο σε ευχαριστώ και πάλι για το σχόλιο σου. Η DDate είναι τύπου string (κειμένου) και το αναφέρω στο τέλος της αρχικής μου ανάρτησης, για αυτό χρησιμοποίησα την DateValue. Το επίπεδο μου στη VBA είναι μέτριο θα έλεγα, ως αυτοδίδακτος, εάν υπάρχει κάποια ορθότερη λύση από αυτή πολύ ευχαρίστως να τη χρησιμοποιήσω για πάω και ένα βήμα πιο πέρα.
Και πάλι ευχαριστώ για βοήθεια σας.

Tasos 13-02-20 23:55

Συγνώμη Δημήτρη. Δεν πρόσεξα ότι η DDate ήταν τύπου κειμένου.

Ωστόσο για περισσότερη συμβατότητα ειδικά αν το πρόγραμμα μας πρόκειται να τρέξει σε άγνωστο υπολογιστικό περιβάλλον όσον αφορά τη μετατροπή της συμβολοσειράς DDate και αφού γνωρίζουμε ότι η μορφή ημερομηνίας του πεδίου DDate είναι "d/M/yyyy" ή dd/MM/yyyy", είναι προτιμότερο να χρησιμοποιήσουμε μια συνάρτηση φτιαγμένη στα μέτρα μας.

Παράδειγμα:

Κώδικας:

Private Function ConvertToSQLDate(DateString As Variant) As String
    Dim DateParts() As String
    If InStr(1, DateString, "/") = 0 Then
        ConvertToSQLDate = "IS NULL"
        Exit Function
    End If
    DateParts = Split(DateString, "/")
    ConvertToSQLDate = "= #" & DateParts(1) & "\/" & DateParts(0) & "\/" & DateParts(2) & "#"
'    Debug.Print ConvertToSQLDate
End Function

'Χρήση της συνάρτησης:

Dim strSQL As String
strSQL = "SELECT * FROM ΠΙΝΑΚΑ" _
        & " WHERE ΠΕΔΙΟ_Α= '" & cntro & "' AND" _
        & " ΠΕΔΙΟ_Β='" & kdkos & "' AND ΠΕΔΙΟ_Γ='" & eds & "' AND" _
        & " ΠΕΔΙΟ_Δ='" & tm & "' AND ΗΜΕΡΟΜΗΝΙΑ " & ConvertToSQLDate(dDate)


Dimitriss 15-02-20 19:09

Ευχαριστώ Τάσο για τη χρήσιμη παρατήρησή σου. Θα κάνω τη σχετική αλλαγή.

Dimitriss 15-02-20 19:26

Αγαπητέ Τάσο έκανα την αλλαγή που πρότεινες αλλά με μία μικρή τροποποίηση γιατί μου έδινε Runtime error 3075. Άλλαξα το :
ConvertToSQLDate = "= #" & DateParts(1) & "/" & DateParts(0) & "/" & DateParts(2) & "#"
Με την παραπάνω αλλαγή τρέχει κανονικά.
Ευχαριστώ.

Tasos 15-02-20 22:31

Να είσαι καλά Δημήτρη μου!
Το σφάλμα 3075 προκαλείται όταν η μεταβλητή strSQL χρησιμοποιηθεί για φιλτράρισμα φόρμας ή έκθεσης. Έπρεπε να το διευκρινίσω.

Αν η strSQL με τα διαχωριστικά "\/" χρησιμοποιηθεί για ερώτημα θα λειτουργήσει κανονικά. Το έχω κάνει πάρα πολλές φορές.

Καλή συνέχεια!


Η ώρα είναι 23:45.

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2