2015-10-13 60 views
1

我有一個這樣的數據庫字段:字符串比較日期從MySQL數據庫與實體框架C#

Timestamp varchar(19) utf8mb4_unicode_ci 

包含時間戳(串)這樣

"2013-05-29 00:00:00" 

我現在用的是實體框架和我想按時間過濾 - 這意味着我想讓所有條目的時間戳>(now-interval)。 代碼看起來像這樣

var query = from r in db.route 
        where 
         r.timestamp > (now-interval); 
        select r; 

我該怎麼做?

+2

爲什麼您的日期以varchar的形式存儲在數據庫中?你能改變它嗎? – DavidG

+2

可能重複[如何在EF查詢中執行日期比較?](http://stackoverflow.com/questions/1088212/how-do-i-perform-date-comparison-in-ef-query) – gpinkas

+0

@gpinkas不是dup,因爲它處理DATE列而不是VARCHAR。 – juharr

回答

1

我的第一個建議是修復數據庫,以便將日期值存儲爲正確的日期類型。這將解決許多問題並提高搜索性能。但是,在(不太可能)情況下,您無法做到這一點,並且該列中值的格式與您在問題中指定的格式完全匹配,您可以將本地時間戳變量轉換爲字符串並進行比較直。由於您所顯示的格式具有與日期順序相同的字母數字排序,因此它應該可以正常工作:

//It's important that this is done here and not inline with the Linq query 
var nowInterval = timeStamp.ToString("yyyy-MM-dd HH:mm:ss"); 

var query = from r in db.route 
      where string.Compare(r.timestamp, nowInterval, StringComparison.Ordinal) > 0 
      select r; 
+0

你不應該在24小時內使用HH嗎? – juharr

+0

@juharr哎呀,斑點! – DavidG

+0

感謝您的所有建議!不幸的是,數據庫並不是我自由改變:(當我使用你的代碼時,visual studio提醒我它不能在字符串和字符串上應用運算符'>',它似乎是這樣的: 'SELECT * FROM yourTable WHERE STR_TO_DATE(my_column_with_the_string_date,'%d。%m。%Y')<='2011-09-30'' 可以解決問題,我只是不知道如何把它放在「Entity FW writing」 。任何想法? – hot33331