Το είχαμε συζητήσει αρκετά το θέμα παλιότερα, αν και δεν προλαβαίνω να βρω τώρα τα posts. Ο τρόπος που προτείνεις έχει μερικά προβλήματα όπως η μετατροπή σε char, η χρήση κάποιου συγκεκγριμμένου datetime format και η χρήση πολλών εντολών. Αν σκοπός σου είναι να κάνεις join μεταξύ πινάκων βάση της ημερομηνίας και μόνο, ή αν θέλεις να κάνεις κάποιο select με βάση την ημερομηνία μόνο ή την ώρα μόνο, θα χάσεις τη δυνατότητα χρήσης indexes.
Μία άλλη λύση είναι να εκμεταλλευτείς το γεγονός ότι μία τιμή DateTime αποθηκεύεται ως δεκαδικος αριθμός, με το ακέραιο μέρος να είναι η ημερομηνία και το δεκαδικό η ώρα. Μπορείς έτσι να συγκρίνεις ημερομηνίες κόβοντας το δεκαδικό μέρος. Σε select και join που περιλαμβάνουν δύο ημερομηνίες, π.χ. Date1 και Date2, μπορείς να πάρεις την ημερομηνία μόνο από το Date1 και να ελέγξεις τη συνθήκη:
FLOOR(Date1) <= Date2 and Date2 < FLOOR(Date1) +1
Έτσι εκμεταλλεύεσαι τα indexes που υπάρχουν στο Date2. Αν θέλεις να εκμεταλλευτείς τα indexes και στις δύο τιμές θα πρέπει να χρησιμοποιήσεις ένα calculated field ή ένα view που θα επιστρέφει την FLOOR(Date1) και να φτιάξεις ένα index στο πεδίο αυτό.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos