親們,拿到DateTime.Now你是否也是這樣比較的?


項目中有了找回密碼功能,我很高興是由我做的,嘿嘿。

測試了很多遍沒有問題。結果還是無意中被別人發現了,“數據庫中的失效時間(ExpiredDate)當前時間(DateTime.Now) 存在着 4 分多鍾 的差距”,我一直是取的DateTime.Now 當前時間比較的啊!

首先我們看看,下面的這行代碼,

 var modelCode = LoadRepository.GetEntities<Entity.Verification_Code>().Where(i => i.Code.Equals(code) && i.ExpiredDate >= DateTime.Now).FirstOrDefault();

根據Sql Server Profiler查看SQL,有了驚人的發現:=》 [Extent1].[ExpiredDate] >= GetDate() :

也許你認為可能沒有什么問題,但是我看了看查詢分析器解析后的Sql,拿到的Sql中的DateTime.Now 卻變成了GetDate(),這什么情況;

exec sp_executesql N'SELECT TOP (1) 
[Extent1].[VerificationID] AS [VerificationID], 
[Extent1].[UserID] AS [UserID], 
[Extent1].[Code] AS [Code], 
[Extent1].[AddDate] AS [AddDate], 
[Extent1].[ExpiredDate] AS [ExpiredDate], 
[Extent1].[Status] AS [Status]
FROM [dbo].[Verification_Code] AS [Extent1]
WHERE ([Extent1].[Code] = @p__linq__0) AND ([Extent1].[ExpiredDate] >= (GetDate()))
',N'@p__linq__0 varchar(8000)',
@p__linq__0=
'f784222508ce4e859426fd0c8b95df8f'

於是我試了試 在 select getdate(); 發現真的 getdate() 與 當前時間存在着誤差

 

我可能明白了,DateTime.Now放在Where中不能進行比較。因為Linq只能與定值進行比較。所以先要轉成值。

修改如下:

  var dateTime = DateTime.Now;
  var modelCode = LoadRepository.GetEntities<Entity.Verification_Code>().Where(i => i.Code.Equals(code) && i.ExpiredDate >= dateTime).FirstOrDefault();

根據Sql Server Profiler查看SQL,問題解決了,DateTime.Now回來了。@p__linq__1='2013-05-28 15:25:37.8470000'

exec sp_executesql N'SELECT TOP (1) 
[Extent1].[VerificationID] AS [VerificationID], 
[Extent1].[UserID] AS [UserID], 
[Extent1].[Code] AS [Code], 
[Extent1].[AddDate] AS [AddDate], 
[Extent1].[ExpiredDate] AS [ExpiredDate], 
[Extent1].[Status] AS [Status]
FROM [dbo].[Verification_Code] AS [Extent1]
WHERE ([Extent1].[Code] = @p__linq__0) AND ([Extent1].[ExpiredDate] >= @p__linq__1)',
N
'@p__linq__0 varchar(8000),@p__linq__1 datetime',
@p__linq__0=
'f784222508ce4e859426fd0c8b95df8f',
@p__linq__1=
'2013-05-28 15:25:37.8470000'

總結:希望親們不要像我這樣菜,也可能這個錯誤只有我一個人犯,細節真的讓人覺得學習是很快樂的一件事!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM