2012-03-23 11 views
-1

HH:MMtt(10:20 AM)の時刻を含むPublishTimeという名前のnvarchar(max)フィールドがあります。フィールドは、nvarchar型であるため、order by節では使用できません。どのようにしてこのフィールドに基づいて結果を並べ替えることができますか?nvarchar(max)タイプの時刻に基づいたレコードの並べ替え

私はあなたが日時フィールドを作成する必要があり、変換エラーに

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

このフィールドのデータ型を変更できますか? – AdaTheDev

+0

NVARCHAR(MAX)をDATETIMEにキャストして、ORDER BY句を使用しようとしましたか? –

+0

実際にそのフィールドのデータはフロントエンドのasp.net、Webページ(ドロップダウンリスト)から来ていますので、datetimeにすると、それらのフィールドに時間を格納できなくなり、すでに持っているレコードがlacsになります時間、私は今、タイプを変更する場合、それらの値は保持されますか? – Abbas

答えて

2

、ここでは理想的であるTIMEデータ型があります - 私は実際にデータ型を切り替えるお勧めしますそのフィールドの最小の、最も適切なデータ型を保持しているデータに使用します。

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 

だから、あなたはデータ型を切り替えることができれば、あなたがして行うことができます:

SELECT Something 
FROM YourTable 
ORDER BY PublishTime 

なし/変換すべての値が有効な時間です、ここで実証するための完全な例だと仮定すると、

フィールドの特別な処理が必要となります。つまり、PublishTimeに適切なインデックスがある場合、それを使用することができます。

+0

変換する前にデータをチェックして、すべての時刻データであることを確認する必要があります。不適切なデータ型を使用する際の問題の1つは、不正なデータが入力されることです。時間データ型では、非時間を入力することはできません。したがって、最初から正しいデータ型を使用する場合は、25:99またはASAPの時刻を修正する必要はありません。 – HLGEM

+0

私はあなたが言ったように、私は選択クエリの列を追加し、今度は時間型に変換され、文字列形式の時間を保持し、そのフィールドを注文しましたが、データベースエンジンは文字列から変換しないようです助けを借りて – Abbas

0

を投げているクエリの下に試してみました。別のフィールドに日付と時刻を文字列として指定します。これは避けるべき反パターンです。あなたはorder byで作る連結日時フィールドを参照するためにCROSS APPLYを利用することができます

:SQL 2008で

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

ORDER BY FullDate 
1

この試してみてください。

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は、この何を?

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

これは時間として文字列をキャストしてから文字列に変換しています。

それは

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

またはそれが何らかの理由でキャストしない場合に変換する必要があります。

私はデータと時間を1つの値にしてから変換して、それを順序付けするためにキャストしますが、

データを取り込むときに何かすることを真剣に考えています。これは非常にまれな要件でない限り、インデックスを作成できるように日付時刻を取得します。それはひどく非効率的になるだろう。

関連する問題