2

データベースには、誕生日のように1日だけの日付列があります。ただし、SQL Serverはそれらを日付と時刻として格納し、レコード内の時刻にはさまざまな値があります(どのようにそのようになったかはわかりません)。

問題は、すべてのユーザーに対してクエリを実行し、特定の日付に設定された(ADO.NETを使用して)時刻が深夜であるbirthdates <= {some date}ため、等しいクエリが返されないことです。DateTime

私は何が起こっているのか理解しています。問題は、これをどのように処理するのが最善かということです。23:23:59.999999999の時間で日付まで強制することはできますが、問題があるように感じます。

これを処理するための標準的なベストプラクティスは何ですか?

4

4 に答える 4

7

{some_date}に1日を追加し、未満の比較を使用するだけです。翌日の午前12時であることを確認してください...

于 2012-12-21T21:32:23.777 に答える
3

これを頻繁にクエリする必要がある場合は、計算された永続化された列を追加してDATETIMEDATE(SQL Server 2008以降を使用していると仮定して)次のようにキャストします。

ALTER TABLE dbo.YourTableName
ADD JustDay AS CAST(YourDateTimeColumn AS DATE) PERSISTED

そうすれば、クエリを実行できるようにJustDayなり、DATE時間の部分は必要ありません。計算されるため、常に更新する必要はありません。SQL Serverは、これを自動的に実行します。また、永続化されているため、テーブルのディスク上の構造の一部であり、他の列のクエリと同じくらい高速です。必要に応じて、インデックスを作成することもできます。

これは古典的なスペースです-対-速度のトレードオフ-すべての誕生日の日付のみの部分も保存しているので、ディスク上の構造が大きくなります。一方、インデックスを作成できる日付のみの列があるため、検索を高速化するための優れた方法があります。

于 2012-12-21T21:45:43.203 に答える
1

あなたは言う

問題は、人々がすべての生年月日<={ある日付}に対してクエリを実行することです。

WHEREあなたはそれをそのままにして、人々が彼らの条項で次のようなものを使うことによって時間を取り除くことを確実にすることができます:

CONVERT(DATETIME,CONVERT(CHAR(8),birthdates,112))<= {some date} 

..またはそれ以降のバージョンのSQL-Server:

CONVERT(DATE,birthdates)<= {some date} 

ただし、これは回避策であり、他のアドバイスを利用して、実際のターゲットデータの時間を取り除くのに最適です。

于 2012-12-22T13:08:30.387 に答える
0

もう1つのオプションは次のとおりです。

DATEDIFF(d, birthdates, {some date}) <= 0
于 2012-12-21T21:37:37.160 に答える