1

チェックする番号を指定して返すものがあるかどうかを確認したいのですが、そのクエリがエントリを返さない場合は、エントリに到達するまで番号を増やしてそのエントリを表示します。現在、コードは次のようになっています。

        SELECT * 
    FROM news
    WHERE DATEDIFF(day, date, getdate() ) <= #url.d#
    ORDER BY date desc

ここで #url.d# は渡される整数です (たとえば 31)。それでも結果が返されない場合は、エントリが見つかるまで #url.d# に格納されている数を 1 ずつ増やしたいと考えています。

4

4 に答える 4

3

この種のインクリメンタル クエリは効率的ではありません。「100 以上の結果は必要ないので、これらを教えてください」と言うと、より良い結果が得られます。

SELECT top 100 *
FROM news
ORDER BY date desc

次に、特定の日のアイテム (結果の最初のアイテムとして共通の日付を持つアイテムなど) のみが必要な場合は、クライアント側でさらにフィルター処理します。

または、複数のクエリ リクエストを 2 つのクエリ リクエストに変換することもできます。

DECLARE
  @theDate datetime,
  @theDate2 datetime

SET @theDate = (SELECT Max(date) FROM news)
  --trim the time off of @theDate
SET @theDate = DateAdd(dd, DateDiff(dd, 0, @theDate), 0)
SET @theDate2 = DateAdd(dd, 1, @theDate)

SELECT *
FROM news
WHERE @theDate <= date AND date < @theDate2
ORDER BY date desc
于 2009-07-20T17:08:39.997 に答える
0

1行が必要な場合:

SELECT t.*
  FROM NEWS t
 WHERE t.id = (SELECT MAX(n.id)
                 FROM NEWS n
                WHERE n.date BETWEEN DATEADD(day, -:url.d, getDate()) AND getDate())

DATEADD が必要な日数だけさかのぼるために負の値を使用していることは明らかではないかもしれません。

その日付のすべての行が必要な場合:

SELECT t.*
  FROM NEWS t
 WHERE t.date BETWEEN DATEADD(day, -:url.d, getDate()) AND getDate())
于 2009-07-21T00:50:17.983 に答える
0

まず、where 句で DateDiff 関数を使用して avpod を使用することをお勧めします。代わりに、目的のカットオフ日付を計算し、where 句内の日付列で計算を使用します。これはより効率的です。

WHERE DATEDIFF(day, date, getdate() ) <= #url.d#

あなたは次のようなものを持っているでしょう

WHERE date >= @cutoffDate

ここで、@cutoffDate は #url.d# に基づいて計算された日付です

さて、正しい締め切り日をつかむことについて。私の仮定では、通常の状況では、リクエストから返される記事があると思います。それ以外の場合は、最新の日付から記事を取得するだけです。したがって、私がとるアプローチは、計算されたカットオフ日付の最も古いものを取得することです (#url.d# と最新の記事の日付に基づいています。次のようなもの)。

-- @urld == #url.d
-- compute the cutoff date as the OLDEST of the most recent article and
-- the date based on #url.d
declare @cutoff datetime
select @cutoff =  DateAdd(dd,-1*@urld,GetDate())
select @cutoff


select @cutoff = min(cutoffDate)
from 
(SELECT Max(date) as cutoffDate from News
UNION
select @cutoff) Cutoff


-- grab the articles with dates that are more recent than the cutoff date
select *
from News
WHERE date >= @cutoff

また、日付を真夜中に丸めたいと思うかもしれません (ここでは行いませんでした)。これはマルチクエリのアプローチであり、おそらく単一のストアド プロシージャで実装する必要があります...これが探しているものである場合。

プロジェクト頑張ってください!

于 2009-07-20T17:50:20.647 に答える
0

MySQL

SELECT  news.*,
        (
        SELECT  COUNT(*)
        FROM    news
        WHERE   date < DATEADD(day, GETDATE(), -#url.d#)
        )
FROM    news
WHERE   date >= DATEADD(day, GETDATE(), -#url.d#)
ORDER BY
        date DESC
LIMIT 1

SQL Server

SELECT  TOP 1
        news.*,
        (
        SELECT  COUNT(*)
        FROM    news
        WHERE   date < DATEADD(day, GETDATE(), -#url.d#)
        )
FROM    news
WHERE   date >= DATEADD(day, GETDATE(), -#url.d#)
ORDER BY
        date DESC

この構文を使用すると、クエリがsargabledateになることに注意してください。つまり、インデックスを使用して効率的にフィルター処理できます。

于 2009-07-20T17:10:04.173 に答える