5

今日の支払いレポートを取得する簡単なクエリがあります。これを自動化して毎晩送信したいのですが、その日の午前 12 時から午後 11 時 59 分までレポートを実行したいと考えています... 午後 9 時にレポートを送信するので、おそらくそれが簡単な場合は、午後 9 時までに取得するだけで済みます。

これが私のクエリです:

SELECT        COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
FROM            Payouts
WHERE        (dtCreated BETWEEN @startdate AND @enddate)
4

6 に答える 6

6

BETWEEN は使用せず、開始日 >= および終了日 < 1 日後に使用します。

WHERE (dtCreated >= @startdate AND dtCreated < DATEADD(day, 1, @enddate))

その理由は、BETWEEN は終了日の午前 0 時まで検出されますが、それ以降は検出されないためです。

更新しました

今日の日付の場合、次のことができます。

WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, dtCreated)) = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

これは、dtCreated今日のあるポイントに等しいことを確認します。

更新しました

@ScottChapman が指摘したように、DATE型に直接キャストすることで、変換体操を行わなくても同じことができます。ただし、このタイプは MSSQL 2008 以降でのみ使用できます。

于 2012-12-19T19:57:40.287 に答える
2

これらの回答のいくつかは近いですが、午後 11 時 59 分 30 秒など、1 日の最後の 1 分の時間を除外しています。このクエリには、今日のすべてが含まれます。

SELECT        COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
FROM            Payouts
WHERE        (dtCreated >= CAST(GETDATE() as date) AND dtCreated < DATEADD(day, 1, CAST(GETDATE() as date)))

dateタイプは SQL Server 2008 で追加されたため、これは SQL Server 2005 以下では機能しないことに注意してください。

于 2012-12-19T20:12:23.030 に答える
2
SET @StartDate = CAST(GETDATE() AS date)
SET @EndDate = DATEADD(MINUTE, -1, DATEADD(DAY, 1, @StartDate))

SELECT        COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
FROM            Payouts
WHERE        (dtCreated BETWEEN @startdate AND @enddate)
于 2012-12-19T19:58:22.567 に答える
1

SQL/Server 2008 を使用しているため、DATETIME 列を DATE に変換して選択することで、DATETIME 列から任意の時間要素を削除できます。

SELECT COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
  FROM Payouts
 WHERE CONVERT(DATE,dtCreated) = CONVERT(DATE,GETDATE())

はるかにエレガント

[編集] ああ、スコット チャップマンの回答を読んだところです。dtCreated にインデックスが付けられている場合、クエリはより効率的になります。

于 2012-12-19T20:13:49.980 に答える
0

両方をSIMPLE日付の例に設定しますBETWEEN '2012-12-19' AND '2012-12-20'。タイムスタンプを付けずに、その間を選択します。

この例では、終了日をに設定してから'2012-12-20 23:59:59.999'実行すると、次のようにSELECT @enddateなります。'2012-12-21 00:00:00.000'

または、関数型の構文を使用するには:

  declare @mystart as datetime
  declare @myend as datetime
  set @mystart = dateadd(day,datediff(day,0,CURRENT_TIMESTAMP),0)
  set @myend = dateadd(day,datediff(day,0,CURRENT_TIMESTAMP),1) 
  select @mystart, @myend

ここでの@mystartは、日付部分(時刻は00:00:00.000)のみに設定され、終了はそのプラス1日に送信されるため、BETWEEN構文が機能します。

于 2012-12-19T20:37:39.010 に答える
0

前の回答には午前 12 時未満のデータも含まれています

SELECT 
  COUNT(*) AS Number
  , SUM(dblPayoutAmt) AS Amount
FROM 
  Payouts
WHERE
  dtCreated >= dateadd( hour, 12, cast( cast( getdate() as date ) as datetime ))
  and dtCreated < dateadd( second, -1, dateadd(day, datediff(day, -1, getdate()), 0))
于 2012-12-19T20:01:45.230 に答える