Warum hat nicht nur einen Blick?
SELECT DateHr2 FROM dbo.View_MyTable
WHERE DateHrProper >= '20120412'
AND DateHrProper < '20120413';
Sie zu verwirren haben nicht mit dem Schema der Tabelle Auf diese Weise, und Sie können den beharrte berechneten Spalt Ansatz untersuchen nur, wenn Sie benötigen:
CREATE VIEW dbo.View_MyTable
AS
SELECT
DateHr,
DateHr2 = CONVERT(VARCHAR(24), CONVERT(DATETIME, '20' + DateHr), 100)),
DateHrProper = CONVERT(DATETIME, '20' + DateHr)
FROM dbo.MyTable;
Jetzt können Sie Ihre Abfrage sein . Wenn Sie eine berechnete Spalte hinzufügen, würde ich sie als Datetime-Spalte hinzufügen, nicht als eine andere Zeichenfolgendarstellung desselben Datums. Machen Sie es "hübsch" auf der Ausgabe, nicht im Speicher.
BEARBEITEN Wenn Sie Schreibvorgänge in die Tabelle über eine gespeicherte Prozedur steuern können (sehr empfehlenswert) und Benutzer keine Ad-hoc-Einfügungen/Aktualisierungen ausführen lassen, können Sie den Basistyp ändern und müssen sich keine Sorgen machen über den Unsinn, den sie eingehen könnten. Zum Beispiel:
UPDATE dbo.MyTable
SET DateHr = CONVERT(DATETIME, '20' + DateHr);
-- assuming there are no rows left where `ISDATE(DateHr) = 0`,
-- but you'll have to test that:
ALTER TABLE dbo.MyTable ALTER COLUMN DateHr DATETIME;
GO
ALTER PROCEDURE dbo.ProcThatUpdatesMyTable
@key INT,
@DateHr NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
IF ISDATE('20' + @DateHr) = 0
BEGIN
RAISERROR('Please enter a valid date.', 11, 1);
RETURN;
END
UPDATE dbo.MyTable
SET DateHr = CONVERT(DATETIME, '20' + @DateHr)
WHERE key = @key;
END
GO
Jetzt ist Ihre Abfrage, wo Sie April 11, 2012 4:49 PM
als Ausgabe wollen - leider gibt keine native Möglichkeit ist, einfach auf dieses Format in SQL Server zu übersetzen. Sie können es mit allen Arten von String-Manipulation, z.B.:
;WITH x AS
(
SELECT
d = DATENAME(MONTH, DateHr) + ' '
+ CONVERT(VARCHAR(2), DAY(DateHr)) + ', '
+ CONVERT(CHAR(5), YEAR(DateHr)),
t = CONVERT(CHAR(26), DateHr, 109)
FROM dbo.blab
)
SELECT d = d + LEFT('0' + RIGHT(t, 13), 5) + ' ' + RIGHT(t, 2) FROM x;
Diese auf die gewünschte Ausgabe ganz in der Nähe ist:
April 11, 2012 04:49 PM
können Sie mehr String-Manipulation tun, um die führende 0 auf der Stunde zu entfernen, wenn Sie wollen.
Viel besser, dies auf dem Client zu formatieren. Auf der positiven Seite, können Sie diese einfach in SQL Server 2012 mit der neuen FORMAT()
Funktion tun:
SELECT FORMAT(DateHr, 'MMMM dd, yyyy h:mm tt')
FROM dbo.MyTable;
Ergebnis:
April 11, 2012 4:49 PM
Und natürlich werde ich erwähnen, dass wieder die ultimative Lösung ist, Lassen Sie Ihre Nutzer das Freetext-Format nicht eingeben. Ich garantiere Ihnen, dass jemand den 5. April eingibt, wenn er den 4. Mai oder Dezember 2011 meinte, als sie November 2012 bedeuteten. Lassen Sie ihn aus Drop-downs oder einem Kalender-Steuerelement wählen, wo Sie vollständige Kontrolle über die Strings haben, die an SQL Server in einem Safe übergeben werden Format statt sich auf die Stimmung der Person an diesem Tag zu verlassen, wird sicherstellen, dass Sie immer wissen, dass das Datum ist, was der Benutzer ausgewählt hat (auch wenn ihr regionales Format möglicherweise nicht das ist, was Sie erwarten).
Warum verwenden Sie nicht den richtigen Datentyp in der Spalte 'DateHr'? –
Ich kann die Art, wie der Wert eingegeben wird, nicht ändern, und wenn ich zu datetime Datentyp wechsle, wird es als '12/4/2011 4:49:23 PM' interpretiert, was falsch ist. – Rick
Ist es stattdessen möglich, einen Trigger zu erstellen, wenn ein neuer Datensatz erstellt wird, um ein neues Feld mit dem Datentyp datetime zu aktualisieren, und ich verwende das stattdessen? – Rick