1

私はテーブル、すなわちBookingDetailsを持っています。BookingDetailsには次のフィールドが含まれています。

顧客ID

デートから

DateTo

TimeFrom

の時間

BookingDetailsにはn個のレコードが含まれています。

CustomerID    DateFrom     DateTo       TimeFrom    TimeTo
11137         2012-08-14   2012-08-16   00:33:46    03:33:46
11138         2012-08-15   2012-08-17   08:00:00    00:31:03
11139         2012-08-16   2012-08-17   22:46:25    00:46:25

指定された情報DateFromDateToTimeFromTimeToの間でレコードを選択したい。

私は次のクエリをしました

declare @fDate date
set @fDate = '2012-08-14' 

declare @tDate date
set @tDate = '2012-08-16'

declare @fTime time
set @fTime ='12:33:46 AM'

declare @tTime time
set @tTime='12:31:03 AM'

SELECT BookingDetails.CustomerID
FROM BookingDetails 
WHERE  (DateFrom between @fDate and @tDate) And (BookingDetails.DateFrom >= @fDate     and BookingDetails.DateTo<=@tDate)
and(TimeFrom between CONVERT(varchar(15),cast(@fTime as time) , 108) and CONVERT(varchar(15),cast(@tTime as time) , 108))
and (TimeFrom >=CONVERT(varchar(15),cast(@fTime as time) , 108) and TimeTo <=CONVERT(varchar(15),cast(@tTime as time) , 108)) 

データベースの時間節約は24時間形式です。クエリで使用される時間は12時間形式であるため、クエリで24時間形式に変換します。

このクエリは正しいですか、それとも変更する必要がありますか?

このクエリは値を返しません。@ fDate 、@ tDate@ fTime @ tTimeの間のレコードを選択したい

最初の2つのcustomerID、つまり11137,11138の結果を期待しています

4

1 に答える 1

1

開始と終了を別々の値ではなくDATETIMEとして渡してみませんか?実際、これらが特定の時点であり、2つの値が離れているよりも一緒に重要であることが明らかなのに、なぜDATEとTIMEを別々に格納するのですか?とにかく、現在のスキーマを考えると、文字列への変換を停止する必要があります。これを試して:

DECLARE @b TABLE (  
   CustomerID INT,
   DateFrom DATE,
   DateTo DATE,
   TimeFrom TIME,
   TimeTo TIME 
);

INSERT @b VALUES (11137,'2012-08-14','2012-08-16','00:33:46','03:33:46'),
                 (11138,'2012-08-15','2012-08-17','08:00:00','00:31:03'),
                 (11139,'2012-08-16','2012-08-17','22:46:25','00:46:25');

declare @fDate date
set @fDate = '2012-08-14' 

declare @tDate date
set @tDate = '2012-08-16'

declare @fTime time
set @fTime ='12:33:46 AM'

declare @tTime time
set @tTime='12:31:03 AM'

;WITH x AS 
(
  SELECT 
    CustomerID, DateFrom, TimeFrom, DateTo, TimeTo,
    [Start] = DATEADD(SECOND, DATEDIFF(SECOND,'00:00',TimeFrom), 
              CONVERT(DATETIME, DateFrom)),
    [End]   = DATEADD(SECOND, DATEDIFF(SECOND,'00:00',TimeTo),   
              CONVERT(DATETIME, DateTo))
  FROM @b
)
SELECT * FROM x WHERE [Start] 
  BETWEEN     CONVERT(DATETIME, @fDate) + CONVERT(DATETIME, @fTime)
          AND CONVERT(DATETIME, @tDate) + CONVERT(DATETIME, @tTime);
于 2012-08-31T18:34:32.407 に答える