Type to search.

Date nanoseconds field type

Serverless

Elastic Cloud Serverless projects are autoscaled environments, fully managed by Elastic and available on Elastic Cloud.

Availability

  • Generally available

    This functionality is generally available and ready for production usage.

Serverless interfaces and procedures might differ from classic Elastic Stack deployments.

Stack

The Elastic Stack includes Elastic's core products such as Elasticsearch, Kibana, Logstash, and Beats.

Availability

  • Generally available

    This functionality is generally available and ready for production usage.

Unless stated otherwise on the page, this functionality is available when your Elastic Stack is deployed on Elastic Cloud Hosted, Elastic Cloud Enterprise, Elastic Cloud on Kubernetes, and self-managed environments.

This documentation corresponds to the latest patch available for each minor version. If you're not using the latest patch, check the release notes for changes.

This data type is an addition to the date data type. However there is an important distinction between the two. The existing date data type stores dates in millisecond resolution. The date_nanos data type stores dates in nanosecond resolution, which limits its range of dates from roughly 1970 to 2262, as dates are still stored as a long representing nanoseconds since the epoch.

Queries on nanoseconds are internally converted to range queries on this long representation, and the result of aggregations and stored fields is converted back to a string depending on the date format that is associated with the field.

Date formats can be customised, but if no format is specified then it uses the default:

JavaScript
"strict_date_optional_time_nanos||epoch_millis"

For instance:

JSON
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "date": {
        "type": "date_nanos"
      }
    }
  }
}
PUT my-index-000001/_bulk?refresh
{ "index" : { "_id" : "1" } }
{ "date": "2015-01-01" }
{ "index" : { "_id" : "2" } }
{ "date": "2015-01-01T12:10:30.123456789Z" }
{ "index" : { "_id" : "3" } }
{ "date": 1420070400000 }
GET my-index-000001/_search
{
  "sort": { "date": "asc"},
  "runtime_mappings": {
    "date_has_nanos": {
      "type": "boolean",
      "script": "emit(doc['date'].value.nano != 0)"
    }
  },
  "fields": [
    {
      "field": "date",
      "format": "strict_date_optional_time_nanos"
    },
    {
      "field": "date_has_nanos"
    }
  ]
}
  1. The date field uses the default format.
  2. This document uses a plain date.
  3. This document includes a time.
  4. This document uses milliseconds-since-the-epoch.
  5. Note that the sort values that are returned are all in nanoseconds-since-the-epoch.
  6. Use .nano in scripts to return the nanosecond component of the date.
  7. You can specify the format when fetching data using the fields parameter. Use strict_date_optional_time_nanos or you’ll get a rounded result.

You can also specify multiple date formats separated by ||. The same mapping parameters than with the date field can be used.

Warning

Date nanoseconds will accept numbers with a decimal point like {"date": 1618249875.123456} but there are some cases (#70085) where we’ll lose precision on those dates so they should be avoided.

Aggregations are still on millisecond resolution, even when using a date_nanos field. This limitation also affects transforms.

<hr>

Synthetic source may sort date_nanos field values. For example:

JSON
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "date": { "type": "date_nanos" }
    }
  }
}
PUT idx/_doc/1
{
  "date": ["2015-01-01T12:10:30.000Z", "2014-01-01T12:10:30.000Z"]
}

Will become:

JSON
{
  "date": ["2014-01-01T12:10:30.000Z", "2015-01-01T12:10:30.000Z"]
}