2017-01-30 7 views
0

私が使用してみました1だった:それは同じ年の正しい結果が得られますLINQクエリが与えられた二つの日付の間のレコードを見つけるために

.Where(f => f.Date.CompareTo(Date1) >= 0 && f.Date.CompareTo(Date2) <= 0) 

- もし日付1 - 1月20日/ 2017年と日付2 -1/30/2017

しかし、もし日1 - 2015年1月20日と日付2 - 2017年1月30日

それは1/20の間にすべての年の結果を返し、 1/30

01への変更は不可能で、Date形式が常に同じになる場合はStringを使用してこれを達成しようとしています。

+9

yyyyMMDDのような形式でない限り、日付の 'string'比較はできません。比較を行うには、それらを「DateTime」または意味のある部分(月、日、年)に解析する必要があります。 – juharr

+0

文字列としての日付の格納は、非正規化の形式です。言い換えれば、それは悪いデータベース設計なので避けるべきです*。理由はあなたの質問からかなり明らかです。正規化されていないデータは、照会や比較などができません。正しい列型を使用するか、日付で照会しないでください。それがあなたの選択です。 –

+0

*不可能*このような不可欠な改善には当てはまりません。少なくともDateTimeでは、既存のフィールドを置き換えるのではなく、トリガーと同期させる代わりに、フィールドを追加することができます。私は確かにs/oの腕をねじれようとします。 –

答えて

0

絶対にデータベースの設計を変更する方法はありませんがあります場合は、コメントで示唆されているように、あなたはすべてのデータを取得し、ローカルにdateに変換するか、値が変換されますDBでビューを作成するか試みることができますdateタイプに変更します。

.Select(f=> new {Record=f, Date=DateTime.Parse(f.Date)}) 
.Where(f => f.Date >= Date1 && f.Date <= Date2) 

私はあなたがSqlFunctions(ただし、私はそれを試したことがありません)

.Select(f=> new {Record=f, Date= SqlFunctions.DateAdd("day", 0, f.Date)}) 
.Where(f => f.Date >= Date1 && f.Date <= Date2) 

と直接SQLでそれを変換することができると思う:あなたはこのような何かを行うことができ、最初のオプションについては

または直接ここで:

.Where(f => SqlFunctions.DateAdd("day", 0, f.Date) >= Date1 && SqlFunctions.DateAdd("day", 0, f.Date) <= Date2) 

2番目のオプションは、作成する01 DB内のconvert (datetime, *yourDateField*, 101) - あなたのケースでは101が不明です。

明確にする:これらはどれも最適化されていません。 DBデザインを変更するのがベストです

関連する問題