質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

3回答

18524閲覧

WHERE句で前日分

pinchhachance

総合スコア12

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/02/20 00:41

SQL ServerにおいてWHERE句として、前日分を条件として指定する際に
最もコストが抑えられるのはどのような記述の仕方でしょうか。

日付型項目(yyyy-mm-dd hh:mm:ss)

日付型項目 >= DATEADD(d, -1, GETDATE())
and 日付型項目 < DATEADD(d,0, GETDATE()))

とかですかね?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

アプリケーションから ADO.NET を使ってクエリ発行 / データ取得を行うのであれば、アプリケーションを含めたコスト(開発工数、保守工数、セキュリティ、最適化など)を考えてはいかがでしょう。

たとえば、クエリは以下のようにパラメータ化して、パラメータはアプリから渡すというように。そういうアプリは、Visual Studio のウィザードを使ってほとんど自力でコードを書くことなく実装できますし。

SELECT [OrderID], [CustomerID], [EmployeeID], [OrderDate] FROM [Orders] WHERE (([OrderDate] >= @OrderDate) AND ([OrderDate] <= @OrderDate2))

投稿2017/02/20 02:25

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

前提として、DB のカラムに対して何らかの関数を適用するのはお勧めしません。
なぜならこれをやると、そのカラムにはインデックスが効かないからです。

よって、前日を示す日時による挟み込みを行うのが適切でしょう。

とどのつまり、例に挙げられた方法が一番かと思います。
その上でそのカラムにインデックスを付ける、くらいですかね。
※もっと大規模だとそもそも日付単位でパーティション分けするとかもあり得ますが

そしてその上で実際の実行計画を見てチューニングすることになるかと思います。

投稿2017/02/20 01:18

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hsk

2017/02/20 02:31

仮に「暦日の前日(時刻部分を無視した前日)」としてhihijijiさんのご回答を混ぜると 日付型項目 >= DATEADD (d, -1, CONVERT (date, GETDATE())) AND 日付型項目 < CONVERT (date, GETDATE()) のようになりますね。
guest

0

SQL Server の処理は、SQL文全体をクエリオプティマイザが解釈して実行計画を立て、コンパイルし実行します。
ですからWHERE句だけでの最適解はありません。
また、クエリオプティマイザは統計情報やバージョンによって細かい挙動が変わってきます。
よってSQL文全体の最適解もその場の実行環境でのみ有効です。

それを踏まえたうえでのアドバイスとしては、

  1. クエリオプティマイザが解釈しやすいように極力シンプルに書く。
  2. キャッシュは期待してもいい。

です。

そこで私のお勧めは、
CONVERT (date, 日付型項目) = DATEADD (d, -1, CONVERT (date, 日付型項目))
です。

CONVERT (date, 日付型項目) を2度書くのは冗長ですが、それはクエリオプティマイザに期待します。


PS.ここまで書いて何ですが、tacsheavenさんに一票入れました。

投稿2017/02/20 01:40

編集2017/02/20 02:34
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問