-1

I have 2 strings, say:

Meter_read_date= "2019-10-04"
Settlement_date= "2019-10-02"

I wanted to write Condition such that if difference between meter_read_date and settlement_date is less than 5 0r metter_read_date=settlement_date than do something or else do something).

I have the below code:

if (RegID > 0)
{
    var MPAN = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.MPAN }).FirstOrDefault();
    var D0071_SEND = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.D0071_SEND }).FirstOrDefault();
    var ROLECODE = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.ROLECODE }).FirstOrDefault();
    var TARIFFTYPE = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.TariffType }).FirstOrDefault();
    var NORMAL_METER_READ = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.NORMAL_METER_READ }).FirstOrDefault();
    var LOW_METER_READ = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.LOW_METER_READ }).FirstOrDefault();
    var METER_READ_DATE = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.METER_READ_DATE }).FirstOrDefault();
    var BILL_GENERATED = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.BILL_GENERATED }).FirstOrDefault();
    var SETTLEMENT_DATE_REGI = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.SETTLEMENT_DATE_REGI }).FirstOrDefault();
    var CUST_REFERENCE = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.CUST_REF_NUMBER }).FirstOrDefault(); //added by amit on 18-06-19
    var ADDRESS = (from reg in ApproveCustRead where reg.REGISTRATION_ID == RegID select new { reg.CUST_ADDRESS }).FirstOrDefault(); // added by amit on 19-06-19



    if (Flow == "71")
    {
        D0071Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(SETTLEMENT_DATE_REGI.SETTLEMENT_DATE_REGI.Trim()));
    }
    else if (Flow == "10")
    {
        D0010Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(METER_READ_DATE.METER_READ_DATE.Trim()));
    }
    else if (Flow == "RR")
    {
        DateTime startdate = Convert.ToDateTime(METER_READ_DATE);//latest date
                                    DateTime enddate = Convert.ToDateTime(SETTLEMENT_DATE_REGI);//old date
                                    string D0071send = Convert.ToString(D0071_SEND);
                                    if ((startdate - enddate).Days < 5  || startdate.Date==enddate.Date)
                                    {
                                        if(D0071send == "YES")
                                        {
                                            D0010Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(METER_READ_DATE.METER_READ_DATE.Trim()));

                                        }
                                        else
                                        {
                                            D0071Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(SETTLEMENT_DATE_REGI.SETTLEMENT_DATE_REGI.Trim()));

                                        }
                                    }
                                    else
                                    {
                                        D0010Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(METER_READ_DATE.METER_READ_DATE.Trim()));

                                    }
    }
}

How can I proceed with this? I tried in else if(flow="RR") but not worked.

halfer
  • 19,824
  • 17
  • 99
  • 186
chetan kambli
  • 794
  • 5
  • 21
  • _difference between meter_read_date and settlement_date is less than 5_ 5 days, months or years? – André Sanson Oct 08 '19 at 12:26
  • When you subtract one `DateTime` from another, the result is a [TimeSpan](https://learn.microsoft.com/dotnet/api/system.timespan), which has convenient properties to tell you how many hours, days etc. those two values differ. – Corak Oct 08 '19 at 12:27
  • @AndréSanson less than 5 days – chetan kambli Oct 08 '19 at 12:29
  • 1
    OT you can make the code much simpler by just getting the one ApproveCustRead record you want, and then just read the properties. Your current code might query the database 11 times. – Hans Kesting Oct 08 '19 at 12:36
  • @HansKesting i am doing it for the multiple selected customers.. – chetan kambli Oct 08 '19 at 12:48
  • I meant: store the result of `ApproveCustRead.FirstOrDefault(reg => reg.REGISTRATION_ID == RegID)` and use the properties of that. For the next RegID, you get a fresh one – Hans Kesting Oct 08 '19 at 13:04
  • @HansKesting i modified my code.. kindly check as it is giving me error as "Unable to cast object of type '<>f__AnonymousType12`1[System.String]' to type 'System.IConvertible'.' – chetan kambli Oct 08 '19 at 13:33

3 Answers3

1

If the strings are always in that format:

int yearStart = Convert.ToInt32(Meter_read_date.Substring(0, 4));
int monthStart = Convert.ToInt32(Meter_read_date.Substring(2, 2));
int dayStart = Convert.ToInt32(Meter_read_date.Substring(4,2));

DateTime startDate = new DateTime(yearStart, monthStart, dayStart);

//You could possibly skip the three lines of variables and put them directly in the startDate.
//Do the same for the other date and create a variable endDate.

Now you can use this post:

(endDate - startDate ).TotalDays
Jannick Breunis
  • 195
  • 2
  • 14
1

This Worked for me:

DateTime startdate = Convert.ToDateTime(Convert.ToString(METER_READ_DATE.METER_READ_DATE));//latest date
                                    DateTime enddate = Convert.ToDateTime(Convert.ToString(SETTLEMENT_DATE_REGI.SETTLEMENT_DATE_REGI));//old date
                                    string D0071send = Convert.ToString(D0071_SEND);
                                    if ((startdate - enddate).Days < 5  || startdate.Date==enddate.Date)
                                    {
                                        if(D0071send == "YES")
                                        {
                                            D0010Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(METER_READ_DATE.METER_READ_DATE.Trim()));

                                        }
                                        else
                                        {
                                            D0071Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(SETTLEMENT_DATE_REGI.SETTLEMENT_DATE_REGI.Trim()));

                                        }
                                    }
                                    else
                                    {
                                        D0010Send(RegID, Convert.ToString(MPAN.MPAN.Trim()), Convert.ToString(ROLECODE.ROLECODE.Trim()), Convert.ToString(TARIFFTYPE.TariffType.Trim()), Convert.ToInt32(NORMAL_METER_READ.NORMAL_METER_READ), Convert.ToInt32(LOW_METER_READ.LOW_METER_READ), Convert.ToString(METER_READ_DATE.METER_READ_DATE.Trim()));

                                    }
chetan kambli
  • 794
  • 5
  • 21
0

It appears that you are trying to subtract a string from the a date time. If METER_READ_DATE is always created as a string in that format, you should be able to parse it and then compare it to the other string when that is also parsed.

//RequestMeterRead(RegID);
if (DateTime.Parse(METER_READ_DATE).Day - DateTime.Parse(SETTLEMENT_DATE_REGI).Day < 5)
{

}
help-info.de
  • 6,695
  • 16
  • 39
  • 41
TSkip
  • 1