2009-03-31 8 views
1

データベース内の2つの列SlotID(int identity)とSlotTime(varchar)を持つMyテーブルはTimeListと呼ばれます。範囲の値を取得するには

SlotID SlotTime 
1  8:00AM-8:15AM 
2  8:15AM-8:30AM 
3  8:30AM-8:45AM 
4  8:45AM-9AM 
5  9AM-9:30AM 

同様に、午後6時45分午後7時00分まで。

starttimeとendtimeを午前8時に、endtimeを午前9時に渡すと、上記のテーブルの最初の4行を取得したいと思います。誰でもこのようなストアドプロシージャを持つことができますか?

答えて

2

それはこのように見えるようにテーブルをリファクタリングすることが可能であろう:あなたは別の列に時間を分割した場合

SlotID SlotStart SlotEnd 
---------------------------- 
1  8:00am  8:15am 
2  8:15am  8:30am 
... 

、日付の範囲を照会することが容易になります。

@StartTime = '8:00am' 
@EndTime = '9:00am' 

select SlotID, SlotStart, SlotEnd 
from Slots 
where SlotStart >= @StartTime 
and SlotEnd <= @EndTime 
1

あなたのデータが適切に正規化されていないので、照会するのは難しいだろう:クエリは次のようになります。フィールドには、単一の値のみが含まれている必要がありますので、あなたは別の分野におけるスロットの開始と終了の時間が必要です。

SlotID StartTime EndTime 
1  8:00AM  8:15AM 
2  8:15AM  8:30AM 
3  8:30AM  8:45AM 
4  8:45AM  9:00AM 
5  9:00AM  9:30AM 

また、これはあなたの代わりにテキストデータ型のフィールドに日時の種類を使用することができますがあなたは簡単にテーブルクエリを実行できるように、:あなたの元のテーブルの設計で

select SlotId, StartTime, EndTime 
from TimeList 
where StartTime >= '8:00AM' and EndTime <= '9:00AM' 

を、あなたは、フィールドの値を分割する文字列操作を使用する必要があり、それが同等にするために値を変換します。テーブルに大量のデータがある場合、クエリではインデックスを使用できないため、これはパフォーマンスにとって大きな障害になります。

+0

AMbやPMをASCIIbetically sortableにするために時間の前に置く必要はありませんか? – Thorsten79

+0

はい、テキストデータ型を使用する場合は、値を比較可能にするために、「AM08:00」のような厄介な書式を使用する必要があります。 – Guffa

0

問題は、テーブルが正規化されていないことです。 http://en.wikipedia.org/wiki/Database_normalizationでそれを読んでください、あなたが設計するシステムの品質を大幅に向上させることができます。

あなたの現在のケースでは、Andyのアドバイスに従って、SlotStartとSlotEndを分けてください。あなたの時間形式も良くありません。 DateTime形式(またはデータベースがあなたの時間型として提供するもの)を使用するか、INTなどの数値型を使用して値を格納します(たとえば、午後6時の代わりに1800)。

その後、あなたは簡単にSlotStart> = ... AND SlotEnd < = ...

TimeList FROM

SELECTを使用して、あなたのテーブルから好きな選択することができます。

関連する問題