Τρόπος διόρθωσης & lsquo; Αποτυχία μετατροπής κατά τη μετατροπή ημερομηνίας ή / και ώρας από συμβολοσειρά χαρακτήρων & rsquo; Λάθος?

Υπάρχουν πολλές περιπτώσεις όταν οι ημερομηνίες και οι ώρες δεν εμφανίζονται στη μορφή που θέλετε, ούτε μια έξοδος ερωτήματος ταιριάζει στις ανάγκες των θεατών. Υπάρχουν πολλές ενσωματωμένες δυνατότητες του SQL Server για τη μορφοποίηση της συμβολοσειράς ημερομηνίας σύμφωνα με τις ανάγκες σας, αλλά για να ερμηνευθεί η συμβολοσειρά από τον SQL Server και για να αποφευχθούν σφάλματα μετατροπής, θα πρέπει να είναι σε σωστή μορφή. Όταν προσπαθούμε να μετατρέψουμε ημερομηνία ή ώρα από συμβολοσειρά χαρακτήρων, προκύπτει μερικές φορές το σφάλμα. "Η μετατροπή απέτυχε κατά τη μετατροπή ημερομηνίας ή / και ώρας από συμβολοσειρά χαρακτήρων."

σφάλμα μετατροπής ώρας ημερομηνίας

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

Παράδειγμα 1:

Ηνωμένο Βασίλειο Σημείωση ημερομηνίας και ώρας εμφανίζει την ημερομηνία χρησιμοποιώντας τη μορφή ημέρας-μήνα-έτους (10 Ιανουαρίου 2015 ή 10/1/2015) την οποία μπορούμε να επιτύχουμε χρησιμοποιώντας τη λειτουργία ενσωματωμένης λειτουργίας SQL Server "μετατροπή" με στυλ μορφοποίησης 103.

Εδώ στο παρακάτω παράδειγμα μπορούμε να δούμε ότι η παρεχόμενη συμβολοσειρά ημερομηνίας είναι σε λάθος μορφή. Πρώτον, παρέχει το μήνα, μετά τις ημέρες και το τελευταίο έτος, το οποίο είναι λάθος και δεν μπορεί να ερμηνευτεί από τον SQL Server, το οποίο οδηγεί σε σφάλμα. Η σωστή μορφή για μετατροπή ημερομηνίας σε στυλ ΗΒ χρησιμοποιώντας το στυλ ημερομηνίας "103" είναι "ηη / μμ / εεεε".

Λάθος μορφή:

Δηλώστε @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'select CONVERT (datetime2, @date_time_value, 103) ως UK_Date_Time_Style

Σωστή μορφή:

Η μορφή ημερομηνίας Βρετανίας και Γαλλίας είναι 103 = "dd / mm / yyyy" ή 3 = "dd / mm / yy". Εδώ 103 και 3 είναι στυλ ημερομηνίας.

Δηλώστε @date_time_value varchar (100) = '10 / 1/15 21:02:04 'select CONVERT (datetime2, @date_time_value, 103) ως Date_Time_Style
Δηλώστε @date_time_value varchar (100) = '10 / 1/15 21:02:04 'select CONVERT (datetime2, @date_time_value, 3) ως UK_Date_Time_Style

Παράδειγμα 2:

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

Λάθος ημερομηνία:

Ο λόγος για το ακόλουθο σφάλμα είναι απλώς ότι το έτος 2019 δεν υπάρχει ημερομηνία όπως η «29 Φεβρουαρίου», επειδή δεν είναι άλμα.

Δηλώστε @date_time_value varchar (100) = '2019-02-29 21:02:04' select cast (@date_time_value as datetime2) ως date_time_value

Σωστό:

Δηλώστε @date_time_value varchar (100) = '2019-02-28 21:02:04' select cast (@date_time_value as datetime2) ως date_time_value

Μορφή ημερομηνίας ISO 8601:

Παρόλο που είναι διαθέσιμες πολλές μορφές για το χειρισμό τιμών ημερομηνίας, όταν εργάζεστε για μια παγκόσμια / διεθνή μάζα, μπορεί να είναι ένα ζήτημα χρηστικότητας για την επιλογή μιας παράστασης χρόνου Επομένως, πρέπει να αποφεύγονται οι ειδικές για την κουλτούρα ημερομηνίες / ώρα. Αν λάβουμε υπόψη αυτήν την ημερομηνία «03/08/2018», θα ερμηνευτεί με διαφορετικούς τρόπους σε διαφορετικές περιοχές του κόσμου.

  • Στο βρετανικό στιλ ερμηνεύεται ως «8 Μαρτίου 2018»
  • Σε ευρωπαϊκό στιλ ερμηνεύεται ως «3 Αυγούστου 2018»

Ευτυχώς, υπάρχει μια εναλλακτική λύση στη διεθνή μορφή ημερομηνίας που αναπτύχθηκε από το ISO. Η καθολική τυποποιημένη μορφή ISO 8601 "YYYY-MM-DDThh: mm: ss" είναι μια πιο ανεξάρτητη από τη γλώσσα επιλογή για γραμματοσειρές συμβολοσειρών και αντιμετωπίζει όλα αυτά τα ζητήματα. Ενώ, «yyyy» είναι το έτος, «mm» είναι μήνας και «dd» είναι ημέρα. Έτσι, η ημερομηνία "8 Μαρτίου 2018" σε διεθνή μορφή ISO γράφεται ως "2018-03-08". Έτσι, η μορφή ISO είναι η καλύτερη επιλογή για αναπαράσταση ημερομηνιών

Δηλώστε @date_time_value varchar (100) = '2019-03-28 21:02:04' select convert (datetime2, @ date_time_value, 126) ως [yyyy-mm-ddThh: mi: ss.mmm]

Προτάσεις:

Ας ελπίσουμε ότι αυτό το άρθρο θα βοηθήσει στην ανακούφιση της σύγχυσης που έχω δει συχνά στην κοινότητα σχετικά με τις τιμές ημερομηνίας / ώρας. Ωστόσο, συνιστάται να μην αποθηκεύετε ποτέ ημερομηνίες σε τύπο κειμένου (varchar, char, nvarchar, nchar ή text) Να αποθηκεύετε πάντα την τιμή ημερομηνίας σε στήλες DATE, DATETIME και κατά προτίμηση DATETIME2 (παρέχει μεγαλύτερη ακρίβεια) και να μην αφήνετε τη μορφή πληροφοριών ημερομηνίας στο επίπεδο διεπαφής χρήστη αντί να ανακτηθεί από τη βάση δεδομένων.