これは、数年後でも頻繁に追加の票を集め続けるため、SQLServerの最新バージョン用に更新する必要があります。 Sql Server 2008以降の場合、それは簡単です:
cast(getDate() As Date)
下部にある最後の3つの段落は引き続き適用されることに注意してください。多くの場合、一歩下がって、最初からキャストを回避する方法を見つける必要があります。
しかし、これを達成する他の方法もあります。最も一般的なものは次のとおりです。
正しい方法(SQL Server 2008以降の新機能):
cast(getdate() As Date)
正しい方法(古い):
dateadd(dd, datediff(dd,0, getDate()), 0)
これは現在では古いものですが、月の最初の瞬間、分、時間、年など、他の時点にも簡単に適応できるため、知っておく価値があります。
この正しい方法では、ANSI規格の一部であり、動作が保証されている文書化された関数を使用しますが、多少遅くなる可能性があります。これは、0日目から現在の日までの日数を見つけ、その日数を0日目に追加することで機能します。日時がどのように保存されていても、ロケールが何であっても機能します。
最速の方法:
cast(floor(cast(getdate() as float)) as datetime)
これは、日時列が8バイトのバイナリ値として格納されるために機能します。それらをフロートにキャストし、フロアに配置して小数部を削除すると、日付にキャストして戻すと、値の時間部分がなくなります。複雑なロジックがなく、すべてが少しシフトしているだけで、非常に 速い。
これは、自動サービス更新であっても、Microsoftがいつでも自由に変更できる実装の詳細に依存していることに注意してください。また、あまりポータブルではありません。実際には、この実装がすぐに変更される可能性はほとんどありませんが、それを使用することを選択した場合は、危険性を認識することが重要です。そして、日付としてキャストするオプションがあるので、それが必要になることはめったにありません。
間違った方法:
cast(convert(char(11), getdate(), 113) as datetime)
間違った方法は、文字列に変換し、文字列を切り捨てて、日時に戻すことで機能します。 間違っています 、2つの理由から:1)すべてのロケールで機能するとは限らない、2)これを行うには可能な限り遅い方法です...ほんの少しではありません。これは、他のオプションよりも1桁または2桁遅いようなものです。
更新 これは最近いくつかの票を獲得しているので、これを投稿してから、SQLServerが「正しい」方法と「速い」方法のパフォーマンスの違いを最適化するというかなり確かな証拠を見てきました。つまり、前者を優先する必要があります。
いずれの場合も、最初にこれを行う必要がないように、クエリを作成する必要があります。 。データベースでこの作業を行う必要があることは非常にまれです。
ほとんどの場所で、データベースはすでにボトルネックになっています。一般に、パフォーマンスを向上させるためにハードウェアを追加するのに最も費用がかかり、それらの追加を正しく行うのが最も難しいのはサーバーです(たとえば、ディスクとメモリのバランスをとる必要があります)。また、技術的にもビジネスの観点からも、外部に拡張するのは最も困難です。技術的には、データベースサーバーよりもWebサーバーまたはアプリケーションサーバーを追加する方がはるかに簡単です。それが間違っていたとしても、IISまたはapacheのサーバーライセンスごとに20,000ドル以上を支払う必要はありません。
私が言いたいのは、可能な限り、この作業はアプリケーションレベルで行う必要があるということです。 のみ SQL Serverで日時を切り捨てるのは、日ごとにグループ化する必要があるときです。その場合でも、追加の列を計算列として設定するか、挿入/更新時に維持するか、アプリケーションで維持する必要があります。論理。このインデックスを破る、CPUを多用する作業をデータベースから取り除きます。