Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

SQL & charIndex + substring

Îåêßíçóå áðü ôï ìÝëïò Bill . Τελευταία δημοσίευση από το μέλος Bill στις 16-07-2008, 01:05. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-07-2008, 19:45 43470

    SQL & charIndex + substring

    Σε ένα πίνακα έχω ένα πεδίο τύπου string το οπόιο (αντί να ήταν Datetime κατά την αποψή μου) αποθηκεύει ημερομηνίες με τις παρακάτω πιθανές τιμές :   '10/12/2008'  ή '1/2/2008' ή '12/3/2008'  ή '1/11/2008' γενικά : dd/mm/yyyy or d/m/yyyy,dd/m/yyyy,d/mm/yyyy δηλαδή με λίγα λόγια η καταχωρήσεις μπορεί κάθε φορά να έχουνε 4 πιθανές μορφές. Ήθελα να κάνω Ordering με βάση την ημερομηνία το πεδίο θυμίζω δεν είναι date έτσι σκέφτηκα τις παρακάτω λύσεις :

    Αρχικά σκέφτηκα απλά να κάνω το πεδίο από string σε datetime ως εξής : cast(convert(datetime,mystring,103) as datetime) as mydates

    Τελικά για λόγους ασφαλείας και γενικά πιο safe επέλεξα να κάνω απλά πρώτα το string  ως yyyymmdd και μετά να κάνω ordering χωρίς να αλλάξω τον τύπο του πεδίου και γενικά να γλιτώσω πιθανών λάθος καταχωρήσεις.... και έκανα τα παρακάτω

    case when patindex('%/%/%',mystring)>0 then substring(mystring,charindex('/',mystring,charindex('/',mystring)+1)+1,4) + Replicate(0,2 - len(substring(mystring,charindex('/',mystring)+1,charindex('/',mystring,charindex('/',mystring)+1) - charindex('/',mystring) -1))) + substring(mystring,charindex('/',mystring)+1,charindex('/',mystring,charindex('/',mystring)+1) - charindex('/',mystring) -1) +
     +Replicate(0,2 -len(substring(mystring,1,charindex('/',mystring) -1)))+substring(mystring,1,charindex('/',mystring) -1)
      else mystring end as mydates

    Ναιιι έκανα όλο αυτό και το έβαλα μέσα σε patindex ώστε να κάνει μόνο όσα έχουνε το παραπάνω φορμάτ xx/xx/xxxx αν δεν έχει απλά το αφήνει όπως ήταν!

    Αυτό που θέλω να ρωτήσω είναι αν υπάρχει άλλο τρόπος πιο απλός ? πιο safe ? γιατί με παίδεψε μέχρι να βρώ τα κατάλληλα charindex ώστε να τα κόβω κάθε φορά με τη substring....

    Ευχαριστώ ! Embarrassed


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  16-07-2008, 00:35 43474 σε απάντηση της 43470

    Απ: SQL & charIndex + substring

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

    Αν είσαι σίγουρος για το format του πεδίου σου πάντως, η convert(datetime, '03/01/2008',103) αρκεί για να μετατρέψει το πεδίο από character σε datetime και να κάνεις sort. Από τη στιγμή που η τιμή του πεδίου έχει ήδη μετατραπεί σε datetime, δεν υπάρχει καμμία περίπτωση να μπλεχτούν ημέρες με μήνες. Άσχετα από το τί locale και collation χρησιμοποιείς, οι η convert(datetime, '03/01/2008',103), η convert(datetime, '03/1/2008',103), η convert(datetime, '3/01/2008',103) και η η convert(datetime, '3/1/2008',103) θα σου γυρίσουν ΠΑΝΤΑ 3 Ιανουαρίου 2008. Δεν υπάρχει λόγος να κάνεις δύο φορές convert  ούτε τόση φασαρία με τα substring.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  16-07-2008, 01:05 43475 σε απάντηση της 43474

    Απ: SQL & charIndex + substring

    Σωστός το απλούστερο είναι να κάνω απλα το πεδίο datetime όπως και στην αρχή αυτό έκανα.Αλλά δεν είμαι σίγουρος για το format του πεδίου μου μπορεί να γίνει (χεράτα) μία λάθος καταχώρηση και αντί για '/' να βάλει '.' ή '-' πχ (12-3-2008) ή κατι τελείος λάθος...  όπως και υπήρχε και μου πέταγε exception  η εφαρμογή "cannot convert string format to datetime"  τέτοια καταχώρηση και τελικά αναγκάστικα να παίξω με το string.Και πάλι το ελέγχο με την patindex να κάνει την μετατροπή μόνο με το συγκεκριμένο format.


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems