2012-02-03 11 views
0

Linq to SQLを使用している日付に基づいてテーブルからレコードを選択しようとしています。残念ながら、日付は2つのテーブルに分割されます。Hoursテーブルには曜日があり、関連するJobTimeテーブルには月と年が2つの列にあります。LINQ to SQLレコードの選択と日付の変換

私は、次のクエリがあります:「データ型のdatetimeに式を変換算術オーバーフローエラー」

Dim qry = From h As Hour In ctx.Hours Where Convert.ToDateTime(h.day & "/" & h.JobTime.month & "/" & h.JobTime.year & " 00:00:00") > Convert.ToDateTime("01/01/2012 00:00:00") 

これは私にエラーを与えるが

SQLサーバプロファイラでのSQLクエリを見て、私は次を参照してください。

exec sp_executesql N'SELECT [t0].[JobTimeID], [t0].[day], [t0].[hours] 
FROM [dbo].[tbl_pm_hours] AS [t0] 
INNER JOIN [dbo].[tbl_pm_jobtimes] AS [t1] ON [t1].[JobTimeID] = [t0].[JobTimeID] 
WHERE (CONVERT(DateTime,(((((CONVERT(NVarChar,[t0].[day])) + @p0) + (CONVERT(NVarChar,COALESCE([t1].[month],NULL)))) + @p1) + (CONVERT(NVarChar,COALESCE([t1].[year],NULL)))) + @p2)) > @p3',N'@p0 nvarchar(4000),@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 datetime',@p0=N'/',@p1=N'/',@p2=N' 00:00:00',@p3='2012-01-31 00:00:00' 

私は正しくを検索する日付を渡していないが、私はそれを修正するかどうかはわかりませんことがわかります。

誰でもお手伝いできますか?

おかげで、 エマ

答えて

0

エラーの直接の原因は、this issueで行う必要があります。

このように、使用するコンバージョンは非常に非効率的なクエリの作成方法です。その上、表現がsargableではないので、非効率的である。私。照会アナライザーが索引を使用して個々の列値にジャンプすることを不可能にする照会で、データベース列からの計算値を使用しています。だから、直接原因を調べることでエラーを修正しようとすることもできますが、比較では単一の列の値だけが使用されるようにクエリを書き直すほうがよいと思います。

私はC#でこれを働いてきた:

var cfg = new DateTime(12,6,12); 
int year = 12, month = 6, day = 13; // Try some more values here. 

// Date from components > datetime value? 
bool gt = (
    year > cfg.Year || (
     (year == cfg.Year && month > cfg.Month) || (
      year == cfg.Year && month == cfg.Month && day > cfg.Day) 
    ) 
); 

あなたはそれが最初のを見てもよいほど簡単ではないのですが、それが動作することを参照してください。もっと多くの比較がありますが、私はインデックスを使用する能力がこれを簡単に上回ることを確信しています。

もっと簡単明快ではないが、20120101のようなソート可能な日付を使用し、それらを(整数として)比較することです。

関連する問題