2009-03-02 6 views
3

私はSQL:わずか30日間のレコードの表示方法

を使用しようとしました
SELECT * from Results 
WHERE DATEDIFF(d,Date,getdate())<30 

しかし、これにはエラーがあるようです。

提出された各レコードには30日しか表示されません。私の構文が正しいかどうか分かりますか?

非常に高く評価された、 スタン

+0

エラーが発生していますか、または正しい値を取得していませんか? – johnc

+0

どのRDMSを使用していますか? – ahsteele

+0

私はMicrosoft Frontpageを使用しています。 –

答えて

0

あなたのクエリが音を探します。あなたが走っているエラーは何ですか?

+0

接続に失敗しました。 未定義関数 'getdate' –

13

構文はOKに見えますが、あなたは「引用」Dateに必要になる場合があります。

SELECT * from Results WHERE DATEDIFF(d, [Date], getdate()) < 30 

あなたは結果の日付という列を持っていますか?

ところで、この意志のに対し、インデックスを使用することはできません。

SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate()) 
+0

はい。私は日付という名前のcloumnを持っています。 10億に感謝します。 –

+2

アップは、インデックスヒントに投票しました。 Thx – AngryHacker

+0

質問の最適化のための+1 –

2

は、Microsoft Accessデータベースを使用している場合は、現在の日付を取得するための関数は(日です)getdate()ではなく、SQL Server用です。

SELECT * 
FROM results 
WHERE ([Date] between DateAdd("d", -30, Date()) and Date()) 

もう一つのヘッドアップ:

3

はこれを試してみてください。 Accessのフィールド「日付」の命名は一般的には悪い考えです。これは予約語なので、すべてのクエリで括弧[]を使用する必要があります。

+0

ああ、私は追加する義務があります。 「SELECT *」をしないで、必要な特定のフィールドを一覧表示します。私の反応の構文は、あなたが必要とするフィールドがわからないので、一例にすぎません。 – JohnFx

0

データベースとしてSQL Serverを指定していません。 Accessでは、DateAddの構文は次のとおりです。DateAdd( "d"、1、 "31-Jan-95")。

+0

厳密に言えば、* Jet *では構文があります。 AccessにはSQL構文がありません.Jet SQL構文しかありません。 –

+0

「厳密に」?いいえ、「Jet」と「Microsoft Access Engine」を意味するために「Jet」という用語を使用しています。 「Access」という言葉が厳密な定義の中に含まれていると考えると、「Access SQL」を口頭で言及することは完全に容認され、誰もが何を意味するのかを知ることができます。 – onedaywhen

+0

多くの人がそれをしています。しかし、データベースエンジン(Jet)と開発プラットフォーム(Access)を区別していない多くの人々の議論と心の両方において、ひどく混乱しています。 –

5

まず、あなたと(このスレッドの回答のほとんどは)SQLバリアントを混ぜています。あなたはSQL Serverについて質問はしていませんが、SQL Serverの構文(GetDate())の使用に関する推奨を得ています。

JohnFxからの答えはあなたに正しいジェットSQL構文提供:

SELECT * 
FROM results 
WHERE ([Date] between DateAdd("d", -30, Date()) and Date()) 

をしかし、彼はフィールド「日付」を命名するアクセス/ジェットには本当に悪いことも正しいです。 WHERE句はで改善されることがあります。

WHERE (results.Date between DateAdd("d", -30, Date()) and Date()) 

が、私は確かに言うことはできません - 私はこの種の問題に遭遇することはないフィールド「日付」という名前を付けたことがないでしょう。

しかし、整数部分が日付と小数部分を示す形式でJetに日付を格納すると、より単純なバージョンが存在することがあります。日付(週または月または四半期ではなく)を扱うときにそのことを、あなたは直接それらに日付の計算を実行することができますので:

WHERE results.Date BETWEEN results.Date-30 AND Date() 

これはあなたJohnFxのDateDiff関数()バージョンとまったく同じ結果が得られます、各行に対してDateAdd関数を呼び出す必要はありません。

重要なことは、Jetデータベースの正しい構文を使用していることです。つまり、DateAdd()の最初の引数は文字列値( "d")であり、SQL Server関数(GetDate ())、代わりに同じ目的(Date())のためにJetの関数を使用する必要があります。しかし、あなたがする必要がないときにSQLでJet/Access関数を使用することを避けることも良い考えです。そのため、 "results.Date-30"バージョンがDateAdd()バージョンより優れていると思うのはなぜですか。

その他:SQLを含む回答を投稿する人は、質問者がSQLを実行するために使用しているデータベースエンジンに細心の注意を払ってください。これらのポスターは慎重に質問を読んでいないので、間違った答えがたくさん見つかっています(どのデータベースエンジンが関連しているかはキーワードからはっきりと分かりました)。

+0

私は最初の質問でタグを見逃していました。これは私に異なる構文を提供してしまいました。それは、それがJet SQLの構文であることを知ってくれるキーワードを教えてくれましたか? – ahsteele

+0

こんにちはDavid、洞察と明確化のおかげで。私は、すべてのアドバイザーに混乱を避けるために、より明確な質問をするべきだった。 私はSQL Server関数ではなくJets SQLに従ってコードの名前を変更し、修正しました。 今すぐ使えます!非常に感謝しています。 =) –

+0

"より良い"というのは、見る人の目の前です。私は時間的顆粒 "d" =日がより明示的であるため、目の上にDateAddバージョンの親切を見つける。 – onedaywhen