-1

これは、Unidac コンポーネントを使用して SQL Server で動作する元のコードです: 私が持っていた uniQuery の SQL (TStrings) で:

 use HIS
    DECLARE @StartDate  DATETIME,
            @EndDate    DATETIME,
            @RoomType   VARCHAR(6)
    ;

     SELECT @StartDate  = '2011-04-15',
            @EndDate    = '2011-04-26',
            @RoomType   = 'DBLMS'
    ;
    WITH 
    cteStayDates AS
    ( 
     SELECT RoomType  = Room_Type,
            StartDate = CASE WHEN Rate_Start_Date < @StartDate THEN @StartDate ELSE Rate_Start_Date END,
            EndDate   = CASE WHEN Rate_End_Date   > @EndDate   THEN @EndDate   ELSE Rate_End_Date   END,
            Rate
       FROM dbo.Room_Rates
      WHERE @RoomType  = Room_Type
        AND @StartDate < Rate_End_Date
        AND @EndDate  >= Rate_Start_Date
    ) 
     SELECT RoomType, StartDate, EndDate, Rate, 
            Days = DATEDIFF(dd,StartDate,EndDate)
                 + CASE WHEN EndDate = @EndDate THEN 0 ELSE 0 END
       FROM cteStayDates
      ORDER BY StartDate
    ;

ボタンをクリックすると、次のものがありました:

procedure TForm1.Button1Click(Sender: TObject);
//uniQuery1.SQL.Add('SET DATEFORMAT DMY');
begin
uniQuery1.Close;
uniQuery1.SQL.Clear;
uniQuery1.SQL.Add('DECLARE @StartDate  DATETIME,');
uniQuery1.SQL.Add('@EndDate    DATETIME,');
uniQuery1.SQL.Add('@RoomType   VARCHAR(6);');
uniQuery1.SQL.Add('SELECT @StartDate  = :a2,');
uniQuery1.SQL.Add('@EndDate    = :a3,');
uniQuery1.SQL.Add('@RoomType   = :a1;');
uniQuery1.SQL.Add('WITH');
uniQuery1.SQL.Add('cteStayDates AS');
uniQuery1.SQL.Add('( SELECT RoomType  = Room_Type,');
uniQuery1.SQL.Add('StartDate = CASE WHEN Rate_Start_Date < @StartDate THEN @StartDate ELSE Rate_Start_Date END,');
uniQuery1.SQL.Add('EndDate   = CASE WHEN Rate_End_Date   > @EndDate   THEN @EndDate   ELSE Rate_End_Date   END,');
uniQuery1.SQL.Add('Rate');
uniQuery1.SQL.Add('FROM dbo.Room_Rates');
uniQuery1.SQL.Add('WHERE @RoomType  = Room_Type');
uniQuery1.SQL.Add('AND @StartDate < Rate_End_Date');
uniQuery1.SQL.Add('AND @EndDate  >= Rate_Start_Date)');
uniQuery1.SQL.Add('SELECT RoomType, StartDate, EndDate, Rate,');
uniQuery1.SQL.Add('Days = DATEDIFF(dd,StartDate,EndDate)');
//uniQuery1.SQL.Add('+ CASE WHEN EndDate = @EndDate THEN 0 ELSE 0 END');
uniQuery1.SQL.Add('FROM cteStayDates  ORDER BY StartDate;');
uniQuery1.Params.ParamByName('a1').AsString := cxTextEdit1.Text;
uniQuery1.Params.ParamByName('a3').AsDate := cxDateEdit2.Date; // end date
uniQuery1.Params.ParamByName('a2').AsDate := cxDateEdit1.Date; // start date
uniQuery1.Open;


end;

今、このコードを絶対データベース (テーブル フィールドは同じ) に移植しようとしていますが、動作させることができません。誰かがこれで私を助けることができますか?

また、このクエリを ABSQuery1 の SQL テキストに入れてみました。

SELECT RoomType, StartDate, EndDate, Rate, 
            Days = DATEDIFF(dd,StartDate,EndDate)
                 + CASE WHEN EndDate = EndDate THEN 0 ELSE 0 END
  RoomType  = Room_Type,
            StartDate = CASE WHEN Rate_Start_Date < StartDate THEN StartDate ELSE Rate_Start_Date END,
            EndDate   = CASE WHEN Rate_End_Date   > EndDate   THEN EndDate   ELSE Rate_End_Date   END,
            Rate
       FROM Room_Rates
      WHERE RoomType  = Room_Type
        AND StartDate < Rate_End_Date
        AND EndDate  >= Rate_Start_Date      ORDER BY StartDate
    ; 

しかし、フィールドを取得できないため、うまくいきません。本当に理由がわからない。接続は正しく設定されています。フィールドを取得しようとすると、次のようになります。 ここに画像の説明を入力

4

1 に答える 1

0

共通テーブル式 ( with cteStayDates as (..)) は、おそらく完全ではない SQL Server の機能です。次のようなものを試すことができます:

 use HIS
    DECLARE @StartDate  DATETIME,
            @EndDate    DATETIME,
            @RoomType   VARCHAR(6)
    ;

     SELECT @StartDate  = '2011-04-15',
            @EndDate    = '2011-04-26',
            @RoomType   = 'DBLMS'
    ;
     SELECT RoomType, StartDate, EndDate, Rate, 
            Days = DATEDIFF(dd,StartDate,EndDate)
                 + CASE WHEN EndDate = @EndDate THEN 0 ELSE 0 END
  RoomType  = Room_Type,
            StartDate = CASE WHEN Rate_Start_Date < @StartDate THEN @StartDate ELSE Rate_Start_Date END,
            EndDate   = CASE WHEN Rate_End_Date   > @EndDate   THEN @EndDate   ELSE Rate_End_Date   END,
            Rate
       FROM dbo.Room_Rates
      WHERE @RoomType  = Room_Type
        AND @StartDate < Rate_End_Date
        AND @EndDate  >= Rate_Start_Date      ORDER BY StartDate
    ;
于 2013-04-08T12:45:48.503 に答える