icon-arrow icon-check icon-mail icon-phone icon-facebook icon-linkedin icon-youtube icon-twitter icon-cheveron icon-download icon-instagram play close close icon-arrow-uturn icon-calendar icon-clock icon-search icon-chevron-process icon-skills icon-knowledge icon-kite icon-education icon-languages icon-tools icon-experience icon-coffee-cup
Werken bij Integration & Application Talents
Blog 31/10/2018

Calculating number of days between dates in DataWeave

Dates

It can be very useful to be able to calculate the difference between two dates. However, calculating this difference in the amount of days seemed a little bit easier to achieve in a DataWeave transformation in Mule 3 than it actually was.

Mike Heeren Integratie interim expert bij Integration & Application Talents
Mike Heeren /
Integratie expert

The default method

We started by implementing the default method to calculate the difference between to dates by just subtracting one from another. This worked fine, however, the result of this subtraction is not a number. The difference between two dates will be represented by a Period object. In most cases this won’t be a problem. However, in our case we explicitly needed to retrieve the amount of days between two dates.

Even though the Period object contains a getDays() method, this would not provide the data we needed. For example, when the Period is P2M7D (2 months and 7 days), the getDays() method just returns 7, so the months will not be translated to days.

Using the getMonths() and getYears() methods and calculating the days by ourselves also isn’t a solution because, of course, month lengths vary and years could include leap years.

Doing it the Java way

So… Back to the drawing board. The next idea was to calculate the difference the same way we could in Java. This means translating dates to (milli)seconds, subtracting and calculating this value back to seconds, minutes, hours and finally days.

In DataWeave :datetime objects can be translated to seconds (so not to milliseconds like Java!) fairly easy, just by casting them to :number objects. Unfortunately, this does not work for :date objects. So we first have to cast a :date to a :datetime (via a :string) object.

When we have both dates represented as seconds, we’re almost done. Just subtract them and we have the difference in seconds. Then it’s a piece of cake to make the calculation from seconds to days.

Example

I have created a DataWeave transformation which demonstrates both of the situations that were explained earlier:

%dw 1.0
%output application/json

// Date values
%var firstDate = "2018-08-24" as :date { format: "yyyy-MM-dd" }
%var secondDate = "2018-10-31" as :date { format: "yyyy-MM-dd" }

// Calculate dates to seconds
%var firstAsNumber = firstDate as :string { format: "yyyy-MM-dd'T00:00:00Z'" } as :datetime as :number
%var secondAsNumber = secondDate as :string { format: "yyyy-MM-dd'T00:00:00Z'" } as :datetime as :number
---
{
     firstDate: firstDate,
     secondDate: secondDate,
     defaultMethod: {
         difference: (firstDate - secondDate),
         differenceDays: (firstDate - secondDate).days
     },
     javaWay: {
         difference: (secondAsNumber - firstAsNumber),
         differenceDays: (secondAsNumber - firstAsNumber) / 60 / 60 / 24
     }
}

The result of the above transformation can be seen below:

{
    "firstDate": "2018-08-24",
    "secondDate": "2018-10-31",
    "defaultMethod": {
        "difference": "P2M7D",
        "differenceDays": 7
    },
    "javaWay": {
        "difference": 5875200,
        "differenceDays": 68
    }
}

 

Geen reacties

Geef jouw mening

Reactie plaatsen

Reactie toevoegen

Jouw e-mailadres wordt niet openbaar gemaakt.

Geen HTML

  • Geen HTML toegestaan.
  • Regels en alinea's worden automatisch gesplitst.
  • Web- en e-mailadressen worden automatisch naar links omgezet.
Mike Heeren Integratie interim expert bij Integration & Application Talents
Mike Heeren /
Integratie expert

Wil je deel uitmaken van een groep gedreven en ambitieuze experts? Stuur ons jouw cv!