Μετατρέψτε τα πεδία datetime SQL server για να συγκρίνετε μόνο ημερομηνία μέρη, με ευρετήριο αναζητήσεις

ψήφοι
28

Έχω κάνει ένα convert(varchar,datefield,112)σε κάθε πεδίο ημερομηνίας που είμαι με τη χρήση σε «μεταξύ» ερωτήματα στον SQL server για να εξασφαλίσουν ότι είμαι αντιπροσωπεύουν μόνο για τις ημερομηνίες και να μην χάσει καμία με βάση το μειωμένο ωράριο των πεδίων datetime.

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

Ποια είναι η βέλτιστη, ευρετηρίασης, μέθοδος για να γίνει κάτι σαν αυτό:

select * from appointments
where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'
Δημοσιεύθηκε 09/12/2008 στις 15:59
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
65

Ο καλύτερος τρόπος για να αφαιρέσει από το χρόνο τμήμα ενός πεδίου datetime χρησιμοποιεί DateDiff και dateadd λειτουργίες.

   DateAdd(day, datediff(day,0, MydateValue), 0)

Αυτό λαμβάνει AdvantEdge του γεγονότος ότι καταστήματα SQL Server ημερομηνίες ως δύο ακέραιους αριθμούς, το ένα αντιπροσωπεύει τον αριθμό των ημερών από την ημέρα «0» - (1 Ιανουαρίου 1900), και η δεύτερη η οποία αντιπροσωπεύει τον αριθμό των κροτώνων (έκαστο τσιμπούρι είναι περίπου 3,33 ms ) από τα μεσάνυχτα (για την ώρα) *.

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

Για να κάνετε τις ερωτήσεις σας χρησιμοποιεί ένα δείκτη ... χρησιμοποιούν αυτόν τον τύπο για την είσοδο φιλτράρισμα παραμέτρους πρώτη, ή στην «άλλη» πλευρά του ίσον από το πεδίο του χρόνου ημερομηνία πίνακες, έτσι ώστε η βελτιστοποίηση ερωτήματος δεν πρέπει να τρέξετε τον υπολογισμό σε κάθε datetime πεδίο στον πίνακα για να προσδιορίσετε τις σειρές ικανοποιήσει το κατηγόρημα φίλτρο. Το γεγονός αυτό καθιστά το επιχείρημα της αναζήτησης σας «ΕΛΚΕ-θέση» (Αναζήτηση επιχείρημα)

Where MyDateTimeColumn > DateAdd(day, 
      datediff(day,0, @MydateParameter), 0)    -- SARG-able

προκειμένου

Where DateAdd(day, datediff(day,0, 
      MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able

* ΣΗΜΕΙΩΣΗ. Εσωτερικά, ο δεύτερος ακέραιος (ο χρόνος μέρος) καταστήματα τσιμπούρια. Σε μια μέρα υπάρχουν 24 x 60 x 60 Χ 300 = 25.920.000 τσιμπούρια (serendipitously μόλις κάτω από την μέγιστη τιμή ένα ακέραιος αριθμός 32 bit μπορεί να χωρέσει). Ωστόσο, δεν χρειάζεται να ανησυχείτε για αυτό, όταν αριθμητικά τροποποίηση ενός datetime ... Κατά την προσθήκη ή την αφαίρεση τιμές από datetimes μπορείτε να προσφέρετε την αξία ως κλάσμα σαν να ήταν ακριβώς ίσο με το κλασματικό μέρος της ημέρας, όπως και αν το πλήρης αξία datetime ήταν ένα αριθμό κινητής υποδιαστολής που αποτελείται από ένα ακέραιο μέρος αντιπροσωπεύει την ημερομηνία και το κλασματικό τμήμα που αντιπροσωπεύει το χρόνο). δηλαδή,

`Declare @Dt DateTime  Set @Dt = getdate()  
 Set @Dt = @Dt + 1.0/24  -- Adds one hour  
 Select @Dt  
 Set @Dt = @Dt - .25 -- Moves back 6 hours  
 Select @Dt`
Απαντήθηκε 09/12/2008 στις 16:07
πηγή χρήστη

ψήφοι
5

Μετατροπή αριθμητικών τύπων σε τιμές συμβολοσειράς (ένα είδος που εγκιβωτίζει) δεν είναι η καλύτερη απόδοση μέθοδος για να γίνει αυτό που ψάχνετε. Του δεν είναι πραγματικά για το δείκτη-θέση, επειδή ο συγκεκριμένος τύπος της στήλης είναι ο χρόνος ημερομηνία.

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

Αυτό

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'

Πρέπει να είναι αυτό

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<='08-14-2008 23:59:59.996'
Απαντήθηκε 09/12/2008 στις 16:11
πηγή χρήστη

ψήφοι
2

Είναι σωστό - να κάνει τη μετατροπή θα εκτελέσει τη μετατροπή για κάθε σειρά ερωτηματικά. Είναι καλύτερα να αφήσει τις στήλες ημερομηνία ημερομηνίες, και να περάσει σε σας, όπου ρήτρες ως ημερομηνίες:

select * from appointments where appointmentdate between 
'08/01/2008' AND '08/16/2008'

Σημείωση: Φεύγοντας από το χρόνο σημαίνει μεσάνυχτα (00: 00.000), οπότε θα περιλαμβάνει όλες τις φορές για 08/01, και όλες τις φορές από 08/15, και ό, τι είναι ακριβώς 08/16/2008 00:00:00

Απαντήθηκε 09/12/2008 στις 16:06
πηγή χρήστη

ψήφοι
1

Έχετε μια υπολογίζεται συνεχίστηκε στήλη υπολογίζει την έκφραση που χρειάζεστε. Αν οι στήλες υπολογίζονται και επέμενε, μπορούν επίσης να αναπροσαρμόζονται.

Απαντήθηκε 09/12/2008 στις 16:10
πηγή χρήστη

ψήφοι
0

Υπάρχει, επίσης, ο τρόπος που περιγράφεται στο http://www.stillnetstudios.com/comparing-dates-without-times-in-sql-server/

SELECT CAST(FLOOR(CAST( getdate() AS float )) AS datetime)
Απαντήθηκε 28/09/2011 στις 13:31
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more