1
以下LINQ to SQL查詢將日期分成多個部分。日期比較使用下面生成的SQL語句似乎很奇怪。從LINQ到SQL生成的T-SQL執行DATEPART
var customers =
(from c in db.customers
where c.servhists.Any(sh => sh.donedate.Value.Date >= startDate.Date
&& sh.donedate.Value.Date <= endDate.Date
&& sh.donedate.Value.AddDays(triggerDays).Date <= DateTime.Now.Date)
產生以下SQL查詢MS SQL Server 2008的
...
WHERE (DATEADD(HOUR, -DATEPART(HOUR, [t3].[donedate]), DATEADD(MINUTE, -DATEPART(MINUTE, [t3].[donedate]), DATEADD(SECOND, -DATEPART(SECOND, [t3].[donedate]), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, [t3].[donedate]), [t3].[donedate])))) >= '6/7/2010') AND (DATEADD(HOUR, -DATEPART(HOUR, [t3].[donedate]), DATEADD(MINUTE, -DATEPART(MINUTE, [t3].[donedate]), DATEADD(SECOND, -DATEPART(SECOND, [t3].[donedate]), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, [t3].[donedate]), [t3].[donedate])))) <= '8/8/2010') AND (DATEADD(HOUR, -DATEPART(HOUR, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000))/86400000, [t3].[donedate]))), DATEADD(MINUTE, -DATEPART(MINUTE, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000))/86400000, [t3].[donedate]))), DATEADD(SECOND, -DATEPART(SECOND, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000))/86400000, [t3].[donedate]))), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000))/86400000, [t3].[donedate]))), DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000))/86400000, [t3].[donedate])))))) <= '10/22/2010')
.. donedate是DateTime類型的空列
我不能想象這有助於提高性能。任何人都可以提出一個修復/更正,我可以做擺脫這個醜陋的SQL?
這可能會返回所有結果在一百萬行的表中,然後才能將它們濾除。 – 2012-03-03 14:00:36
其實不,這就是要點。如果您在對您所比較的變量而不是列進行操作時進行了等效計算,則仍然會對其進行過濾。我會更新答案,以包括我正在談論的一個例子。 – JamieSee 2012-03-06 18:13:20
感謝您的澄清。我現在看到你的意思是什麼......它是有道理的不修改SQL日期時間。 – 2012-03-06 22:19:08