2012-03-23 7 views
-1

Ich habe ein Nvarchar (max) -Feld namens PublishTime, die die Zeit in HH enthält: MMtt (10:20 AM), jetzt möchte ich die Ergebnisse basierend darauf sortieren Feld, aber wie es der Nvarchar-Typ ist, kann ich es nicht für die Reihenfolge nach Klausel verwenden, kann mir jemand helfen, wie kann ich Ergebnisse basierend auf diesem Feld sortieren.Sortierung Datensätze auf der Grundlage der Zeit, die Nvarchar ist (max) Typ

ich unten Abfrage versucht, die Konvertierungsfehler

select c.PublishDate, c.PublishTime from CrossArticle_Article c 
inner join CrossArticle_ArticleToCategory a2c 
on c.Id = a2c.ArticleId 
inner join CrossArticle_Category cc 
on a2c.CategoryId = cc.Id 
where cc.Id = 86 order by c.PublishDate, convert(nvarchar(max), cast(c.PublishTime as time)) desc 
+1

Können Sie den Datentyp dieses Feldes ändern? – AdaTheDev

+0

Haben Sie versucht, den NVARCHAR (MAX) in DATETIME zu konvertieren, um dann die ORDER BY-Klausel zu verwenden? –

+0

tatsächlich Daten für dieses Feld kommt von Front-End asp.net, Webseite (Dropdown-Liste), wenn ich es datetime machen, ich werde nicht in der Lage sein, die Zeit in diesen Bereichen zu speichern, und ich habe auch lacs von Datensätzen, die bereits haben Zeit, wenn ich jetzt den Typ ändere, werden diese Werte beibehalten? – Abbas

Antwort

2

In SQL 2008 gibt es einen TIME-Datentyp, der hier ideal - ich würde wirklich empfehlen, den Datentyp Schalt von diesem Feld - verwende den kleinsten, am besten geeigneten Datentyp für die Daten, die er halten soll.

Unter der Annahme, alle Werte gelten mal, hier ist ein vollständiges Beispiel zu demonstrieren:

CREATE TABLE #Example 
(
PublishTime NVARCHAR(MAX) 
) 

-- Insert some sample data 
INSERT #Example (PublishTime) VALUES ('10:20AM'), ('10:20PM'), (NULL), ('') 

-- Demonstrate the NVARCHAR -> TIME conversion 
SELECT PublishTime, CAST(PublishTime AS TIME) AS ConvertedToTimeDataType 
FROM #Example 

-- This will change the datatype on the table 
ALTER TABLE #Example 
ALTER COLUMN PublishTime TIME 

-- Now check what is now in the table 
SELECT * FROM #Example 

DROP TABLE #Example 

Also, wenn Sie den Datentyp wechseln, können Sie dann tun:

SELECT Something 
FROM YourTable 
ORDER BY PublishTime 

Keine Umwandlung/spezielle Handhabung des Feldes erforderlich, dh wenn in PublishTime ein geeigneter Index vorhanden ist, kann dieser verwendet werden.

+0

Möglicherweise müssen Sie Ihre Daten überprüfen, bevor Sie konvertieren, um sicherzustellen, dass es sich um alle Zeitdaten handelt. Eines der Probleme bei der Verwendung des ungeeigneten Datentyps besteht darin, dass ungültige Daten eingegeben werden. Mit dem Zeitdatentyp können keine Zeiten eingegeben werden. Sie müssen also keine Zeit von 25:99 oder so schnell wie möglich festlegen, wenn Sie den richtigen Datentyp von Anfang an verwenden. – HLGEM

+0

ich tat, wie Sie sagten, fügte ich die Spalte in der Select-Abfrage und dieses Mal wurde es in Zeittyp konvertiert, hielt die Zeit, die im String-Format war, und dann dieses Feld bestellt, aber Datenbank-Engine scheint das nicht von String zu konvertieren Zu Zeit, jede Hilfe – Abbas

0

Sie ein Datetime-Feld machen müssen, ist zu werfen. Sie haben Datum und Uhrzeit in getrennten Feldern als Strings, was ein zu vermeidenes Antipattern ist.

Sie können CROSS APPLY nutzen, um die verketteten Datetime-Feld verweisen Sie in der order by machen:

CROSS APPLY (SELECT CAST((PUBLISHDATE + ' ' +PUBLISHTIME) as datetime)) CxA(FullDate) 

ORDER BY FullDate 
1

versuchen Sie dies:

select c.PublishDate, c.PublishTime from CrossArticle_Article c 
inner join CrossArticle_ArticleToCategory a2c 
on c.Id = a2c.ArticleId 
inner join CrossArticle_Category cc 
on a2c.CategoryId = cc.Id 
where cc.Id = 86 order by cast(c.PublishTime as TIME) desc 
0

Erm Was ist das?

order by c.PublishDate, convert(nvarchar(max), cast(c.PublishTime as time)) desc 

Das wirft eine Zeichenfolge als eine Zeit und konvertiert dann in eine Zeichenfolge.

sollte es

order by c.PublishDate, cast(c.PublishTime as time)) desc 

oder konvertieren, wenn es aus irgendeinem Grund nicht gegossen werden.

Wie andere obwohl ich Daten und Zeit in einem Wert aufbauen würde, und dann für die Bestellung konvertieren/umwandeln.

Ich würde auch ernsthaft etwas tun, wenn ich die Daten einbringe, um ein Datum zu bekommen, damit ich es indizieren kann, es sei denn, dies war eine sehr seltene Anforderung. Es wird furchtbar ineffizient sein.

Verwandte Themen