Wie erstelle ich eine einzigartige Einschränkung nur für den Datumsteil einer Datetime?

9

Ich schreibe eine sehr einfache Blog-Engine für den Eigengebrauch (da jede Blog-Engine, die ich gefunden habe, zu komplex ist). Ich möchte jeden Beitrag eindeutig anhand seiner URL identifizieren können, die etwa /2009/03/05/my-blog-post-slug ist. Um dies in der Datenebene zu erreichen, möchte ich eine zusammengesetzte eindeutige Einschränkung für (Date, Slug) erstellen, wobei Date nur der Datumsteil (ohne Berücksichtigung der Tageszeit) des Zusammenstellungsdatums ist. Ich habe selbst ein paar Ideen (wie eine andere Spalte, wahrscheinlich berechnet, um nur den Datumsteil zu halten), aber ich kam zu SO, um zu wissen, was das beste Verfahren ist, um dieses Problem zu lösen.

Ich bezweifle, dass die SQL Server-Version hier eine Rolle spielt, aber für die Aufzeichnungen bin ich auf 2008 Express (ich schätze eine tragbarere Lösung).

Tabellenschema:

%Vor%

Ausgewählte Lösung:

Ich denke, dass die Lösung von marc angemessener ist, wenn man bedenkt, dass es sich um eine Frage von 2008 handelt. Ich gehe jedoch mit der Integer-Methode (aber nicht mit INSERT s, da sie die Integrität der Daten nicht gewährleistet; verwende eine vorberechnete Integer-Spalte), da ich glaube, dass es einfacher ist, mit dem Integer-Ding vom Client (in der Abfrage) zu arbeiten.

Danke Leute.

%Vor%     
Mehrdad Afshari 06.03.2009, 21:49
quelle

4 Antworten

11

Nun, in SQL Server 2008 gibt es einen neuen Datentyp namens "DATE" - Sie könnten diese Spalte verwenden und einen Index dafür erstellen.

Sie könnten natürlich auch eine berechnete Spalte vom Typ "DATE" zu Ihrer Tabelle hinzufügen und einfach den Datumsteil der DATETIME-Spalte in diese berechnete Spalte füllen, sie PERSISTED machen und sie indizieren. Sollte gut funktionieren!

So ungefähr:

%Vor%

Marc

    
marc_s 06.03.2009, 21:55
quelle
2

Da Sie 2008 sind, verwenden Sie den Date-Datentyp, wie Marc es vorschlägt. Andernfalls ist eine einfachere Lösung eine nicht berechnete Spalte (was bedeutet, dass Sie sie bei einem INSERT ausfüllen müssen), die das Datum im Format YYYYMMDD verwendet. Das ist ein ganzzahliger Datentyp und ist klein und einfach zu verwenden.

    
K. Brian Kelley 06.03.2009 22:10
quelle
1

Für SQL 2005 könnten Sie im Wesentlichen dasselbe tun, was marc_s empfohlen wird, verwenden Sie einfach eine standardmäßige DateTime. Es würde ungefähr so ​​aussehen (ungeprüfter Code hier):

%Vor%

Dann erstellen Sie Ihren Index auf (JustTheDate, Slug)

Hinweis: Die Anweisung DATEADD / DATEDIFF berechnet nur das Datum des CompositionDates.

    
Chris Shaffer 06.03.2009 22:01
quelle
0

Im Laufe der Jahre hatten wir eine Reihe von Problemen mit berechneten Spalten in SQL Server, weshalb wir sie nicht mehr verwenden.

Sie könnten eine VIEW mit einer Spalte nur für das Datum verwenden - und einen eindeutigen Index für die Spalte dieser VIEW erstellen.

(Ein möglicherweise nützlicher Nebeneffekt ist, dass Sie die Ansicht einige Zeilen ausschließen können - also können Sie Dinge wie "DateColumn muss eindeutig sein, aber WHERE DateColumn IS NULL auszuschließen)"

Die vorhandene Spalte "CompositionDate" könnte in zwei Felder aufgeteilt werden - CompositionDate und CompositionTime - und eine Abrufansicht, die sie bei Bedarf wieder zusammenfügt - was dann einen nativen Index für die Spalte "Nur Datum" ermöglichen würde

(Dies kann in SQL 2005 und früher unter Verwendung von DateTime implementiert werden - obwohl leicht extravagant nur für das Datum oder die Zeit und nicht beide)

Und schließlich könnten Sie einen INSERT / UPDATE-Trigger haben, der erzwingt, dass kein anderer Datensatz mit einem doppelten CompositionDate existiert (nur Datumsteil)

    
Kristen 08.03.2009 12:42
quelle