2

最近、SQL Server 2005 に移行したバックエンド MySQL を使用するプロジェクトがありました。MySQL を使用すると、以下のようなクエリが正常に機能し、予想外の結果が得られました。

select * from employees where joindate between '2013-05-01' and '2013-05-01'

ここでは、開始日と終了日が同じです。

MySQL は、'2013-05-01'に入社した従業員の記録を提供していました。T-SQL は、 「2013 年 4 月 30 日」に入社した従業員の記録を提供しています。

テーブルの joindate 列には時刻部分もあり、従業員が日付とともに入社した正確な時刻を記録しています。

この問題の回避策はありますか。よろしければ教えてください。

ありがとう、dpchimmili。

4

2 に答える 2

2

MySQL used to give the records of employees who joined on '2013-05-01'. Where as T-SQL is giving the records of employees who joined on '2013-04-30'

これが、さまざまなサーバーがさまざまな方法で between 関数を実装した方法です。mySQL には同じ日付の間および同じ日付のすべての日付が含まれるため、T-sql にはbetween日付自体ではなく、それらの日付のみが含まれます。

回避策として Where ステートメントを使用するかWHERE joindate >='2013-05-01' and joindate <= '2013-05-01'、jsutWHERE joindate ='2013-05-01'

于 2013-05-01T07:19:43.650 に答える
2

BETWEEN値を にキャストするだけで、TSQL で使用できますDATE

select * from employees 
where CONVERT(DATE, joindate) 
between '2013-05-01' and '2013-05-01'

ただし、日付が次の日付より前かどうかを確認することをお勧めします。これにより、行ごとの計算が回避され、インデックスのヒット率が向上します。

select * from employees 
where joindate>='2013-05-01' 
  and joindate<DATEADD(day,1,'2013-05-01')

でテストする SQLfiddle

于 2013-05-01T07:31:03.610 に答える