Ich persönlich verwende fast immer Benutzerdefinierte Funktionen Wenn Sie mit SQL Server 2005 (oder einer niedrigeren Version) arbeiten, sollten Sie jedoch beachten, dass die Verwendung von UDFs bestimmte Nachteile mit sich bringt, insbesondere bei der Anwendung auf WHERE-Klauseln (siehe unten und die Kommentare zu dieser Antwort für weitere Einzelheiten). Wenn Sie SQL Server 2008 (oder höher) verwenden - siehe unten.
Bei den meisten Datenbanken, die ich erstelle, füge ich diese UDFs gleich zu Beginn ein, da ich weiß, dass ich sie mit 99-prozentiger Wahrscheinlichkeit früher oder später brauchen werde.
Ich erstelle eine für "nur Datum" und eine für "nur Zeit" (obwohl die "nur Datum"-Variante bei weitem die meistgenutzte ist).
Hier sind einige Links zu einer Vielzahl von datumsbezogenen UDFs:
Grundlegende SQL Server-Funktionen für Datum, Uhrzeit und DateTime
Nur Datum holen Funktion
Der letzte Link zeigt nicht weniger als 3 verschiedene Möglichkeiten, um nur das Datum als Teil eines datetime-Feldes zu erhalten, und erwähnt einige Vor- und Nachteile jedes Ansatzes.
Wenn Sie eine UDF verwenden, sollten Sie darauf achten, dass Sie die UDF nicht als Teil einer WHERE-Klausel in einer Abfrage verwenden, da dies die Leistung der Abfrage stark beeinträchtigt. Der Hauptgrund dafür ist, dass die Verwendung einer UDF in einer WHERE-Klausel diese Klausel zu einer nicht kostenpflichtig Das bedeutet, dass SQL Server keinen Index mehr mit dieser Klausel verwenden kann, um die Geschwindigkeit der Abfrageausführung zu verbessern. In Bezug auf meine eigene Verwendung von UDFs verwende ich häufig die "rohe" Datumsspalte innerhalb der WHERE-Klausel, wende aber die UDF auf die SELECTed-Spalte an. Auf diese Weise wird die UDF nur auf die gefilterte Ergebnismenge angewendet und nicht auf jede Zeile der Tabelle als Teil des Filters.
Natürlich ist die absolute am besten Ansatz hierfür ist die Verwendung von SQL Server 2008 (oder höher) und die Abtrennung Ihrer Daten und Zeiten Die SQL Server-Datenbank-Engine stellt dann von Haus aus die einzelnen Datums- und Zeitkomponenten bereit und kann diese unabhängig voneinander effizient abfragen, ohne dass eine UDF oder ein anderer Mechanismus erforderlich ist, um entweder den Datums- oder den Zeitteil aus einem zusammengesetzten Datentyp zu extrahieren.
1 Stimmen
Ich habe dies mit einer Million Datensätzen in einer meiner Produktionstabellen ausprobiert und konnte in beiden Fällen keine genauen Angaben zur Leistung machen. Beide Methoden ergaben jedoch genau dieselbe Datenmenge.
0 Stimmen
Die Manipulation von Zeichenketten ist sehr viel CPU-intensiver. DATEADD und DATEDIFF sind so konzipiert, dass sie die von SQL Server verwendete Speicherdarstellung optimal nutzen.
9 Stimmen
Bei 18.000.000 Zeilen habe ich Folgendes gefunden (SQL Server 2008): Methode b ist etwa 24% langsamer als Methode a. CAST(FLOOR(CAST(getdate() AS FLOAT))) AS DATETIME) ist 3,5 % langsamer als Methode a. Methode a scheint in Bezug auf die Leistung ein Gewinner zu sein. Vielen Dank an alle für die tollen Antworten.
53 Stimmen
Warum zum Teufel hat SQL keine eingebaute Funktion für diese Aufgabe?!
12 Stimmen
Der neue Datentyp DATE von SQL 2008 wird dies übernehmen.
0 Stimmen
Ich habe versucht, CASTing die datetime zu einem Datum und es war sogar langsamer als Methode b. Wenn Sie nicht brauchen, um den Zeitteil zu speichern, dann würde dieser Datentyp sehr gut funktionieren.
3 Stimmen
Mögliche Duplikate von Die effizienteste Art und Weise in SQL Server zu erhalten Datum von Datum + Zeit?
0 Stimmen
Duplikat von Wie entfernt man den Zeitanteil eines Datetime-Wertes (SQL Server)?