Σε ένα πίνακα έχω ένα πεδίο τύπου 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....
Ευχαριστώ ! 
select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ