Linq SQL में Entity फ्रेमवर्क के साथ DateTime प्रकारों में केवल समय के बिना दिनांक की तुलना कैसे करें?


303

क्या समय भाग की अवहेलना करने के लिए दो DateTimeचर की तुलना करने का एक तरीका है Linq2Sql

एप्लिकेशन DB में आइटम संग्रहीत करता है और एक प्रकाशित तिथि जोड़ता है। मैं सटीक समय रखना चाहता हूं, लेकिन फिर भी तारीख तक खींचने में सक्षम हूं।

मैं तुलना करना चाहते हैं 12/3/89 12:43:34और 12/3/89 11:22:12और यह दिन के वास्तविक समय की उपेक्षा तो इन दोनों को एक ही कहा जाता है।

मुझे लगता है 00:00:00कि मैं तुलना करने से पहले दिन के सभी समय निर्धारित कर सकता हूं लेकिन मैं वास्तव में दिन का समय जानना चाहता हूं मैं भी सिर्फ तारीख से तुलना करने में सक्षम होना चाहता हूं।

मुझे कुछ कोड मिले जिनका एक ही मुद्दा है और वे वर्ष, महीने और दिन की तुलना अलग-अलग करते हैं। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

जवाबों:


534

ऑब्जेक्ट Dateपर गुण का उपयोग करने का प्रयास करें DateTime...

if(dtOne.Date == dtTwo.Date)
    ....

25
यदि आप 2017 की शुरुआत के कुछ समय बाद यहां समाप्त होते हैं, तो एंटिटी फ्रेमवर्क के माहौल में तारीखों की तुलना करने का एक तरीका खोज रहे हैं जैसे कि मैंने एलेजांद्रो द्वारा नीचे दिए गए उत्तर की जांच की और वॉचवेयर द्वारा टिप्पणी की।
माइक डेवेनी

8
यदि आप मध्य २०१ you के कुछ समय बाद यहां समाप्त होते हैं, तो ऊपर दिए गए एक और बेहद उपयोगी टिप्पणी को पढ़ने का तरीका ढूंढ रहे हैं, आप भाग्य से बाहर हैं।
nardnob

4
यदि आप 2019 की शुरुआत में कॉमिक राहत की तलाश में कुछ समय बाद यहां समाप्त हो गए हैं, तो आप इसे पा चुके हैं।
फिल रिंग्समथ

1
यह बिल्कुल सही जवाब नहीं है। ओपी ने विशेष रूप से लाइनक को एसक्यूएल और डेटाटाइम कहा। लाइनक अभिव्यक्तियों में अनुमति नहीं है।
फिलिप वॉन

2
यदि आप 2020 की शुरुआत के कुछ समय बाद यहां समाप्त हो जाते हैं, तो मुझे आशा है कि आप खुद की देखभाल कर रहे हैं और कोरोनोवायरस महामारी के दौरान घर पर रह रहे हैं। 2021 में यहां वापस जाएं!
श्री ओटी

61

एक सच्ची तुलना के लिए, आप इसका उपयोग कर सकते हैं:

dateTime1.Date.CompareTo(dateTime2.Date);

18
"सही तुलना" से आपका वास्तव में क्या मतलब है?
रैंडोल्फो

6
Randolpho: == का उपयोग करना आपको समानता प्रदान करेगा, इसलिए चाहे दो तिथियां समान हों या भिन्न। तुलना करें ~ की तुलना करें ~ उन्हें, अर्थात: आपको यह बताने के लिए एक पास में एक तरीका बताएं कि दिनांक 1> दिनांक 2, तारीख 1 <तारीख 2, या तारीख 1 == तारीख 2।
रीड कोपसे

6
@ReedCopsey क्या आप सिर्फ (dateTime1.Date <dateTime1.Date) का उपयोग नहीं कर सकते हैं?
डेविड

14
लेकिन कौन चाहता है -1, 0और 1, वास्तव में? वे "कम", "बराबर" और "अधिक" का प्रतिनिधित्व करने वाले सिर्फ जादुई नंबर हैं। और आपको परिणामी पूर्णांक की तुलना "बाद में" करनी होगी क्योंकि तीन संभावित मूल्य हैं। मुझे @ डेविड से सहमत होना चाहिए कि इसका उपयोग करना अधिक स्वाभाविक है dateTime1.Date < dateTime1.Date, और इसी तरह <=, >और >=अधिकांश अनुप्रयोगों में।
जेपी स्टिग नीलसन

8
@JeppeStigNielsen यदि आप इसे किसी भी प्रकार से उपयोग कर रहे हैं या कॉम्प्रिसन लेते हैं, तो आप इसे चाहते हैं - अन्यथा, आप आमतौर पर केवल ऑपरेटर चाहते हैं।
रीड कोपसे

45

ऐसा मैं LINQ के साथ काम करने के लिए करता हूँ।

DateTime date_time_to_compare = DateTime.Now;
//Compare only date parts
context.YourObject.FirstOrDefault(r =>
                EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare));

यदि आप केवल dtOne.Date == dtTwo.DateLINQ के साथ इसका उपयोग नहीं करते हैं (त्रुटि: निर्दिष्ट प्रकार का सदस्य 'दिनांक' LINQ एंटिटीज में समर्थित नहीं है)


22
यह LINQ से लेकर संस्थाओं तक के लिए बहुत अच्छा काम करता है। हालाँकि, EntityFunctions.NET 4.5.2 में पदावनत किया गया है। बजाय इस का उपयोग करें: DbFunctions.TruncateTime। यह एक समान विधि प्रतीत होती है, बस चली गई ..
waswwizard

25

यदि आप Entity Framework <v6.0 का उपयोग कर रहे हैं, तो EntityFunctions.TruncateTime यदि आप Entity Framework> = v6.0 का उपयोग कर रहे हैं, तो उपयोग करेंDbFunctions.TruncateTime

किसी भी DateTimeवर्ग की संपत्ति के चारों ओर या तो (अपने ईएफ संस्करण के आधार पर) का उपयोग करें, जिसे आप अपने लाइनक क्वेरी के अंदर उपयोग करना चाहते हैं

उदाहरण

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
                                       >= DbFunctions.TruncateTime(DateTime.UtcNow));

बस यहाँ एक अनुस्मारक: जब तक यह इकाई Entity है।
उत्सुक

यह सही उत्तर (2019 तक) होना चाहिए। EntityFunctions का अवमूल्यन हुआ है और आपको लैम्बडा एक्सप्रेशन में datetime.date का उपयोग करने की अनुमति नहीं है (जो भी कारण से - मेरा मतलब है कि गंभीरता से ... क्यों उन्होंने यह तय नहीं किया है ?!)।
फिलिप वॉन

12
DateTime dt1 = DateTime.Now.Date;
DateTime dt2 = Convert.ToDateTime(TextBox4.Text.Trim()).Date;
if (dt1 >= dt2)
{
    MessageBox.Show("Valid Date");
}
else
{
    MessageBox.Show("Invalid Date... Please Give Correct Date....");
}

9
DateTime? NextChoiceDate = new DateTime();
DateTIme? NextSwitchDate = new DateTime();
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date)
{
Console.WriteLine("Equal");
}

यदि आप अशक्त DateFields का उपयोग कर रहे हैं, तो आप इसका उपयोग कर सकते हैं।


3
DateTime dt1=DateTime.ParseExact(date1,"dd-MM-yyyy",null);
DateTime dt2=DateTime.ParseExact(date2,"dd-MM-yyyy",null);

int cmp=dt1.CompareTo(dt2);

   if(cmp>0) {
       // date1 is greater means date1 is comes after date2
   } else if(cmp<0) {
       // date2 is greater means date1 is comes after date1
   } else {
       // date1 is same as date2
   }

2
DateTime econvertedDate = Convert.ToDateTime(end_date);
DateTime sconvertedDate = Convert.ToDateTime(start_date);

TimeSpan age = econvertedDate.Subtract(sconvertedDate);
Int32 diff = Convert.ToInt32(age.TotalDays);

अंतर मान उम्र के लिए दिनों की संख्या को दर्शाता है। यदि मान ऋणात्मक है, तो अंतिम तिथि समाप्ति तिथि के बाद आती है। यह एक अच्छा चेक है।


1

आप उपयोग कर सकते हैं बराबर या compareTo

बराबर : यह दर्शाता है कि दो DateTime उदाहरणों में एक ही तिथि और समय मान है या नहीं।

तुलना रिटर्न मान :

  1. शून्य से कम : यदि यह उदाहरण मान से पहले का है।
  2. शून्य : यदि यह उदाहरण मान के समान है।
  3. शून्य से अधिक : यदि यह उदाहरण बाद में मान से अधिक है।

दिनांक समय शून्य है:

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Value.Date.Equals(second.Value.Date))
{
    Console.WriteLine("Equal");
}

या

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Value.Date.CompareTo(second.Value.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}

दिनांक समय शून्य नहीं है:

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Date.Equals(second.Date))
{
    Console.WriteLine("Equal");
}

या

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Date.CompareTo(second.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}

0

अपने शामिल होने या जहां खंड में, Dateस्तंभ की संपत्ति का उपयोग करें। पर्दे के पीछे, यह एक CONVERT(DATE, <expression>)ऑपरेशन को अंजाम देता है । इससे आपको समय के बिना तारीखों की तुलना करने की अनुमति मिल सकती है।



-16
        int o1 = date1.IndexOf("-");
        int o2 = date1.IndexOf("-",o1 + 1);
        string str11 = date1.Substring(0,o1);
        string str12 = date1.Substring(o1 + 1, o2 - o1 - 1);
        string str13 = date1.Substring(o2 + 1);

        int o21 = date2.IndexOf("-");
        int o22 = date2.IndexOf("-", o1 + 1);
        string str21 = date2.Substring(0, o1);
        string str22 = date2.Substring(o1 + 1, o2 - o1 - 1);
        string str23 = date2.Substring(o2 + 1);

        if (Convert.ToInt32(str11) > Convert.ToInt32(str21))
        {
        }
        else if (Convert.ToInt32(str12) > Convert.ToInt32(str22))
        {
        }
        else if (Convert.ToInt32(str12) == Convert.ToInt32(str22) && Convert.ToInt32(str13) > Convert.ToInt32(str23))
        {
        }

5
-1: क्यों न सिर्फ डेटाइम को पार्स करें और @Quintin रॉबिन्सन विधि का उपयोग करें? यह वह कोड है जो मैं डेली डब्ल्यूटीएफ पर देखने की उम्मीद करूंगा।
विलियम हर्स्ट

इस तरह के चर बनाने की कोई आवश्यकता नहीं है क्योंकि यह इतने आसान काम के लिए प्रतिक्रिया समय बढ़ाता है।
नयन कटकानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.