0

これは比較的基本的な質問だと思いますが、日時は常に私を台無しにし、これを適切に行っていることを確認したいと思います(この監査は上司に昇進します)。SQL Server2008r2を使用します。私が欲しいもののための以下のいくつかのsudoコード

私はtransactionDateが現在日時であることを言及する必要があります。それは物事を変えますか?

DELCARE 
    @today datetime,
    @tomorrow datetime

SET @today = --CODE TO GET THE DATE FOR TODAY
SET @tomorrow = --CODE TO GET THE DATE FOR TOMORROW

SELECT *
FROM table
WHERE custID = '788'
    AND status = 'Cancelled'
    AND transactionDate --IS ONLY TODAY AND NOT TOMORROW OR ANY DAY AFTER
4

4 に答える 4

7

の場合、次のようになりますtransactionDateDATETIME

AND CONVERT(DATE, TransactionDate) = CONVERT(DATE, CURRENT_TIMESTAMP);

の場合、次のようになりますtransactionDateDATE

AND transactionDate = CONVERT(DATE, CURRENT_TIMESTAMP);

これらは両方とも、のインデックスを引き続き使用しますがtransactionDate、これは特殊なケースです。通常、最初の形式は引数可能性を破壊します。

于 2013-03-22T20:35:58.740 に答える
2

日付を使用している場合は、dateデータ型を使用する必要があります。クエリのバージョンは次のとおりです。

SELECT *
FROM table
WHERE custID = '788'
    AND status = 'Cancelled'
    AND cast(transactionDate as date) = cast(getdate() as date)

これは次のように書くこともできます:

select *
from table
where custId = '788' and status = 'Cancelled' and
      TransactionDate >= cast(getdate() as date) and
      TransactionDate < cast(getdate() + 1 as date)

キャストがインデックスの使用を妨げていると思いましたが、アーロンはコメントでそうでないことを教えてくれました。 これは、 SQLServerの保存可能性のより詳細な説明です。

于 2013-03-22T20:36:42.830 に答える
0

他の人が投稿したように、これを行うにはいくつかの方法があります。

最良の方法は、単純に設定することです

where transactionDate = @toDay

このアプローチは、transactionDateにDATE部分のみが含まれ(時間または分がないため、深夜)、@ toDayが同じで、GETDATE()などの場合に機能します。

ljhが書いているように、日にDATEDIFFを実行することもできますが、すべての行でDATEDIFFを実行するため、これは広範囲になります。あまり効率的ではありません。

ただし、日付間は確認できるので、このようになります。

WHERE transactionDate >= '2013-03-22' and transactionDate < '2013-03-23'
--Substitute the chars for variables

これにより、transactionDateが深夜から次の深夜までの間に発生しているすべての行が表示されます。

編集:ゴードンが同じことを答え、インデックスが使用可能であるという部分を含めたのを見たところ、追加するのを忘れていました。

編集:アーロンが指摘したように、間は良いことではありません。私が実際に非アドホックSQLを作成してからしばらく経ちましたので、このようなものを忘れがちです:(

于 2013-03-22T20:51:34.103 に答える
0

これはあなたを助けるかもしれません、ただGETDATE()をあなたの入力DATEに置き換えてください


SELECT *
FROM table
WHERE custID = '788'
    AND status = 'Cancelled'
    AND DATEDIFF(DD,GETDATE(),transactionDate)=0
于 2013-03-22T20:42:56.853 に答える