Περισσότερα
Η μετατροπή απέτυχε κατά τη μετατροπή της ημερομηνίας ή/και της ώρας από συμβολοσειρά χαρακτήρων κατά την εισαγωγή datetime
Προσπαθούσα να δημιουργήσω έναν πίνακα ως εξής,
create table table1(date1 datetime,date2 datetime);
Πρώτα προσπάθησα να εισαγάγω τιμές όπως παρακάτω,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Έδωσε σφάλμα λέγοντας,
Δεν είναι δυνατή η μετατροπή varchar σε datetime
Στη συνέχεια, δοκίμασα την παρακάτω μορφή, όπως προτείνεται από το stackoverflow,
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
Αλλά εξακολουθώ να λαμβάνω το σφάλμα που λέει: "Το σφάλμα είναι το εξής,
Αποτυχία μετατροπής κατά τη μετατροπή ημερομηνίας ή/και ώρας από συμβολοσειρά χαρακτήρων
Καμία πρόταση;
143
3
Υπάρχουν πολλοί μορφότυποι που υποστηρίζονται από τον SQL Server - ανατρέξτε στα MSDN Books Online on CAST and CONVERT. Οι περισσότερες από αυτές τις μορφές εξαρτώνται από τις ρυθμίσεις που έχετε - επομένως, αυτές οι ρυθμίσεις μπορεί να λειτουργούν κάποιες φορές - και κάποιες φορές όχι.
Ο τρόπος επίλυσης αυτού του προβλήματος είναι η χρήση της (ελαφρώς προσαρμοσμένης) μορφής ημερομηνίας ISO-8601 που υποστηρίζεται από τον SQL Server - αυτή η μορφή λειτουργεί πάντα - ανεξάρτητα από τις ρυθμίσεις γλώσσας και μορφής ημερομηνίας του SQL Server.
Η μορφή ISO-8601 που υποστηρίζεται από τον SQL Server έχει δύο εκδοχές:
YYYYMMDD
για απλές ημερομηνίες (χωρίς τμήμα ώρας)- σημειώστε εδώ: όχι παύλες!, αυτό είναι πολύ σημαντικό! ΤοYYYY-MM-DD
είναι ΔΕΝ ανεξάρτητο από τις ρυθμίσεις μορφής ημερομηνίας στον SQL Server σας και ΔΕΝ λειτουργεί σε όλες τις περιπτώσεις!ή:
Αυτό ισχύει για τον SQL Server 2000 και νεότερες εκδόσεις.
Έτσι, στη συγκεκριμένη περίπτωσή σας - χρησιμοποιήστε αυτές τις συμβολοσειρές:
και θα είστε μια χαρά (σημείωση: πρέπει να χρησιμοποιήσετε τη διεθνή 24-ωρη μορφή και όχι τη 12-ωρη μορφή AM/PM για αυτό).
Εναλλακτικά: αν είστε σε SQL Server 2008 ή νεότερο, θα μπορούσατε επίσης να χρησιμοποιήσετε τον τύπο δεδομένων
DATETIME2
(αντί του απλούDATETIME
) και η τρέχουσαINSERT
σας θα λειτουργούσε χωρίς προβλήματα! :-) Ο τύποςDATETIME2
είναι πολύ καλύτερος και πολύ λιγότερο επιλεκτικός στις μετατροπές - και είναι οι συνιστώμενοι τύποι δεδομένων ημερομηνίας/ώρας για τον SQL Server 2008 ή νεότερους έτσι κι αλλιώς.Μη με ρωτήσετε γιατί όλο αυτό το θέμα είναι τόσο δύσκολο και κάπως συγκεχυμένο - έτσι είναι. Αλλά με τη μορφή
YYYYMMDD
, θα πρέπει να είστε εντάξει για οποιαδήποτε έκδοση του SQL Server και για οποιαδήποτε ρύθμιση γλώσσας και μορφής ημερομηνίας στον SQL Server σας.Η μετατροπή στο διακομιστή SQL αποτυγχάνει μερικές φορές όχι λόγω των μορφών ημερομηνίας ή ώρας που χρησιμοποιούνται, αλλά απλώς επειδή προσπαθείτε να αποθηκεύσετε λάθος δεδομένα που δεν είναι αποδεκτά από το σύστημα.
Παράδειγμα:
Δημιουργία πίνακα MyTable (MyDate);
Insert Into MyTable(MyDate) Values ('2015-02-29');
Ο διακομιστής SQL θα εκπέμψει το ακόλουθο σφάλμα:
Αποτυχία μετατροπής κατά τη μετατροπή της ημερομηνίας ή/και της ώρας από συμβολοσειρά χαρακτήρων.
Ο λόγος για αυτό το σφάλμα είναι ότι απλά δεν υπάρχει τέτοια ημερομηνία (29 Φεβρουαρίου) στο έτος (2015).
Απλή απάντηση - το 5 είναι ιταλικό "yy" και το 105 είναι ιταλικό "yyyy". Επομένως:
θα λειτουργήσει σωστά, αλλά
θα δώσει σφάλμα.
Ομοίως,
θα δώσει σφάλμα, ενώ
θα λειτουργήσει.