# Get Month From Date/Time Field \[Painless\]

**URL:** <https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916>\
**Category:** Elasticsearch\
**Tags:** painless\
**Created:** [February 2, 2021, 12:48am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916 "2021-02-02T00:48:54Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 12:48am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/1 "2021-02-02T00:48:55Z")

</div>

Hello  
Following [this example](https://discuss.elastic.co/t/extracting-monthofyear-in-kibana-scripted-field/218322)

When using `doc['timestamp'].value.getMonth();` Getting an error  
[Possible causing node crash, still monitoring]  
`doc['timestamp'].value.getMonthValue();` works as expected and returning month number.

What is the way to get month names? Without using `SWITCH / CASE`

I tried some other functions like `getMonths()`

```auto
if(!doc.containsKey('timestamp') || doc['timestamp'].empty )
return 'None';
else 
return doc['timestamp'].value.getMonths();

```

Also tried `getShortMonths();`

getting errors --\>

```auto
    "type": "illegal_argument_exception",
     "reason": "dynamic method [org.elasticsearch.script.JodaCompatibleZonedDateTime, getMonths/0] not found"

```

Cheers!

---

<div class="post-metadata">

**Author:** ![aaron-nimocks](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aaron-nimocks/32/73965_2.png) [@aaron-nimocks](https://discuss.elastic.co/u/aaron-nimocks)\
**Post date:** [February 2, 2021, 1:03am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/2 "2021-02-02T01:03:44Z")

</div>

Believe the answer is what you tried, or that is what works for me. `getMonth()`

How do you know it's causing a crash? Can you test this in Painless Lab to see if it works there for you?

**Painless Lab**

```auto
ZonedDateTime zdt = ZonedDateTime.parse(params.date); 

return zdt.getMonth();

```

**Parameters**

```auto
{
  "date": "2019-04-10T18:07:50.022Z"
}

```

**Result**

```auto
APRIL

```

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 1:09am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/3 "2021-02-02T01:09:54Z")

</div>

@aaron-nimocks  
Sorry for my ignorance. What is Painless Lab?

Cheers!

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 1:17am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/4 "2021-02-02T01:17:25Z")

</div>

OK Found it 🙂  
It works

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/3/9/3913eb3fefb515a0004d5c9c86f1d5f9346c81e3.png)

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 1:19am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/5 "2021-02-02T01:19:46Z")

</div>

Can I use painless lab with data from my index?

---

<div class="post-metadata">

**Author:** ![aaron-nimocks](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aaron-nimocks/32/73965_2.png) [@aaron-nimocks](https://discuss.elastic.co/u/aaron-nimocks)\
**Post date:** [February 2, 2021, 1:25am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/6 "2021-02-02T01:25:06Z")

</div>

> Can I use painless lab with data from my index?

I don't believe you can yet. Would be nice though!

But you should be able to use `getMonth()` in your script. If it is causing a crash we would be very interested in trying to replicate that error.

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 1:25am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/7 "2021-02-02T01:25:24Z")

</div>

And how is this possible?  
The month is January and returning December?

 ![2021-02-02 12_11_25-Discover - Elastic](https://us1.discourse-cdn.com/elastic/original/3X/e/9/e9a7a13fdf620c8494874666b717e824faf2cab2.png)

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 1:30am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/8 "2021-02-02T01:30:04Z")

</div>

> [@aaron-nimocks](#):
>
> But you should be able to use `getMonth()`

What is the exact syntax?  
Should I use `ZonedDateTime `?

Using this script

```auto
return doc['closed_at'].value.getMonth();

```

Returns this error

```auto
{
 "root_cause": [
  {
   "type": "node_disconnected_exception",
   "reason": "[Node1][IP:9300][indices:data/read/search[phase/query]] disconnected"
  }
 ],
 "type": "search_phase_execution_exception",
 "reason": "all shards failed",
 "phase": "query",
 "grouped": true,
 "failed_shards": [
  {
   "shard": 0,
   "index": "my-index",
   "node": "_RdeNIWkQqKnpzSVXDKhug",
   "reason": {
    "type": "node_disconnected_exception",
    "reason": "[Node1][IP:9300][indices:data/read/search[phase/query]] disconnected"
   }
  }
 ]
}

```

And nodes are not disconnected, for sure. I have 5 nodes up and running.

---

<div class="post-metadata">

**Author:** ![aaron-nimocks](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aaron-nimocks/32/73965_2.png) [@aaron-nimocks](https://discuss.elastic.co/u/aaron-nimocks)\
**Post date:** [February 2, 2021, 1:37am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/9 "2021-02-02T01:37:08Z")

</div>

`return doc['timestamp'].value.getMonth();` gives me the correct output and works in a Scripted Field. You don't need to set the `ZonedDateTime` type since it is reading `timestamp`. I had to in my example or it would think of it as a `String` in Painless Lab.

I am not sure why that is returning that error for you but that's the correct way to do the query. Hope someone else can jump that has seen that error before.

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 1:46am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/10 "2021-02-02T01:46:32Z")

</div>

Thanks @aaron-nimocks

> [@AClerk](#):
>
> And how is this possible?  
> The month is January and returning December?

Any idea about the wrong numbers returned?  
Should I convert the date/time field to the local timezone? How?  
It is showing the correct date/time, but when extracting the month it is showing previous one. As I am in UTC+11 Elastic might think it is previous day?!

A bit confused here...

Cheers!

---

<div class="post-metadata">

**Author:** ![aaron-nimocks](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aaron-nimocks/32/73965_2.png) [@aaron-nimocks](https://discuss.elastic.co/u/aaron-nimocks)\
**Post date:** [February 2, 2021, 1:50am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/11 "2021-02-02T01:50:01Z")

</div>

It could be timezone related but I checked it and couldn't replicate what you are seeing. As far as I can tell the function `getMonth()` doesn't look at all at timezones.

Are you able to share a screenshot of your entire Scripted Field?

Also can you give me an example of data in your `timestamp` field?

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 2:00am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/12 "2021-02-02T02:00:02Z")

</div>

> [@aaron-nimocks](#):
>
> Are you able to share a screenshot of your entire Scripted Field?

This is the script at this moment (ideal will want to return month name.

```auto
doc['closed_at'].value.getMonthValue();

```

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/9/b/9bf1f33f077dc74cfece25efe9021c8e3a40cfa2.png)

Sample data is like the screenshot above.  
And here again

 ![2021-02-02 12_11_25-Discover - Elastic](https://us1.discourse-cdn.com/elastic/original/3X/e/9/e9a7a13fdf620c8494874666b717e824faf2cab2.png)

Also When I use get API (look at `closed_at`)--\>

```auto
{
  "_index" : "my-index",
  "_type" : "_doc",
  "_id" : " __ENC__ NDQ1YTAwNDIxYjE1MjhkMDg1NDZjYmZmMWQ0YmNiMWM=-ZmI0YWNjMDIxYjE1MjhkMDg1NDZjYmZmMWQ0YmNiYjM=",
  "_version" : 105,
  "_seq_no" : 95276,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "closed_at" : "2021-01-01T00:00:31.000+11:00",
    "inc_u_incident_type" : "TYPE",
    "made_sla" : "true",
    "sla" : "SLA",
    "priority" : "Priority",
    "inc_number" : "INC000000",
    "sys_id" : " __ENC__ NDQ1YTAwNDIxYjE1MjhkMDg1NDZjYmZmMWQ0YmNiMWM=-ZmI0YWNjMDIxYjE1MjhkMDg1NDZjYmZmMWQ0YmNiYjM=",
    "inc_contact_type" : "Event",
    "contact_type" : "Event",
    "sla_progress" : 0.0,
    "stage" : "Completed",
    "company" : "Company",
    "state" : "Closed",
    "has_breached" : "HAS_BREACHED",
    "inc_parent_incident" : "",
    "timestamp" : "2021-02-02T12:54:41.394+11:00"
  }
}

```

---

<div class="post-metadata">

**Author:** ![aaron-nimocks](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aaron-nimocks/32/73965_2.png) [@aaron-nimocks](https://discuss.elastic.co/u/aaron-nimocks)\
**Post date:** [February 2, 2021, 2:01am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/13 "2021-02-02T02:01:50Z")

</div>

What is your mapping for `closed_at`?

---

<div class="post-metadata">

**Author:** ![aaron-nimocks](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aaron-nimocks/32/73965_2.png) [@aaron-nimocks](https://discuss.elastic.co/u/aaron-nimocks)\
**Post date:** [February 2, 2021, 2:05am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/14 "2021-02-02T02:05:30Z")

</div>

Also try this in your Scripted Field

```auto
ZonedDateTime zdt = ZonedDateTime.parse(doc['closed_at'].value); 

return zdt.getMonthValue();

```

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 2:08am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/15 "2021-02-02T02:08:48Z")

</div>

> [@aaron-nimocks](#):
>
> Also try this in your Scripted Field

This works well with numbers

```auto
ZonedDateTime doc_closed_at_tz = doc['closed_at'].value.withZoneSameInstant(ZoneId.of('Australia/Sydney'));//AEDT
return doc_closed_at_tz.getMonthValue();

```

So **YES** , need to convert to local TZ.

But still getting errors with `getMonth()`

Cheers!

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 2, 2021, 2:11am UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/16 "2021-02-02T02:11:49Z")

</div>

> [@aaron-nimocks](#):
>
> What is your mapping for `closed_at` ?

```auto
"mappings" : {
      "properties" : {
        "closed_at" : {
          "type" : "date",
          "fields" : {
            "keyword" : {
              "type" : "keyword"
            }
          }
        },
...
...

```

---

<div class="post-metadata">

**Author:** ![AClerk](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aclerk/32/55297_2.png) [@AClerk](https://discuss.elastic.co/u/AClerk)\
**Post date:** [February 3, 2021, 10:48pm UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/17 "2021-02-03T22:48:15Z")

</div>

@aaron-nimocks

Got a reconstruction of the nodes crash.

Following script works in the lab, fails in the scripted fields module.

```auto
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(doc['closed_at.keyword'].value, formatter);
return localDateTime;

```

First run shows an error

```auto
{
 "root_cause": [
  {
   "type": "node_disconnected_exception",
   "reason": "[Node4][IP:9300][indices:data/read/search[phase/query]] disconnected"
  }
 ],
 "type": "search_phase_execution_exception",
 "reason": "all shards failed",
 "phase": "query",
 "grouped": true,
 "failed_shards": [
  {
   "shard": 0,
   "index": "my-index",
   "node": "wKXfVA24TgugQ_bCVs8wZA",
   "reason": {
    "type": "node_disconnected_exception",
    "reason": "[Node4][IP:9300][indices:data/read/search[phase/query]] disconnected"
   }
  }
 ]
}

```

The second run crashes 2 nodes.

Any advise?

---

<div class="post-metadata">

**Author:** ![aaron-nimocks](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/aaron-nimocks/32/73965_2.png) [@aaron-nimocks](https://discuss.elastic.co/u/aaron-nimocks)\
**Post date:** [February 3, 2021, 10:54pm UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/18 "2021-02-03T22:54:57Z")

</div>

I think I would create a new topic for specifically the reason of the failure and might get someone that has a better idea to look at it.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [March 3, 2021, 10:55pm UTC](https://discuss.elastic.co/t/get-month-from-date-time-field-painless/262916/19 "2021-03-03T22:55:24Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
