Date math expressions

Version: 5.x

英文原文地址:Date math expressions

query/filter 中涉及到日期类型时(如:timeout 参数),Elasticsearch 允许我们使用日期数学表达式。

表达式由一个 "anchor" (锚点)日期开头,这个锚点可以是 now 或者其他可用的以 || 结尾的日期格式字符串。锚点之后可以跟着一个数学表达式,支持 + , -/ (舍入取整)。可用的单位有:

  • y (year) 年
  • M (month) 月
  • w (week) 周
  • d (day) 日
  • h (hour) 时
  • m (minute) 分
  • s (second) 秒

单纯的一个整数表示以毫秒为单位的时间,2d 表示 2 天。

更多信息请参阅 Elasticsearch 官方文档中关于 Date Math 的说明。

说明:”锚点||数学表达式“ 所描述的其实就是一个参考日期 + 一个偏移时间。举个栗子:2018-01-01||+1d 表达的是 2018年1月2日

Simple expressions

你可以使用 DateMath 的静态方法创建一个简单的表达式

Expect("now").WhenSerializing(Nest.DateMath.Now);
Expect("2015-05-05T00:00:00").WhenSerializing(Nest.DateMath.Anchored(new DateTime(2015,05, 05)));

字符串会隐式转换成 DateMath

Expect("now").WhenSerializing<Nest.DateMath>("now");

但是不会智能过滤错误的数学表达式

var nonsense = "now||*asdaqwe";

上面这个字符串转换成 DateMath 后会被当作一个锚点日期(没有数学表达式)

Expect(nonsense).WhenSerializing<Nest.DateMath>(nonsense)
.Result(dateMath => ((IDateMath)dateMath)
.Anchor.Match(
d => d.Should().NotBe(default(DateTime)),
s => s.Should().Be(nonsense)
)
);

DateTime 也可以隐式转换成简单的日期数学表达式;生成的锚点是一个实际的 DateTime ,即使经过了往返过程中的序列化/反序列化

var date = new DateTime(2015, 05, 05);
Expect("2015-05-05T00:00:00").WhenSerializing<Nest.DateMath>(date)
.Result(dateMath => ((IDateMath)dateMath)
.Anchor.Match(
d => d.Should().Be(date),
s => s.Should().BeNull()
)
);

Complex expressions

可以将范围链接到简单表达式后面

Expect("now+1d").WhenSerializing(Nest.DateMath.Now.Add("1d"));

可以链接多种操作

Expect("now+1d-1m").WhenSerializing(
Nest.DateMath.Now.Add("1d").Subtract(TimeSpan.FromMinutes(1)));

舍入值可以链接到表达式的末尾,在此之后不能追加其他范围

Expect("now+1d-1m/d").WhenSerializing(
Nest.DateMath.Now.Add("1d")
.Subtract(TimeSpan.FromMinutes(1))
.RoundTo(Nest.TimeUnit.Day));

当设置一个锚点日期(参照日期),需要在定位点和范围之间插入一个分割符 || (自动地)。同样的,后面可以追加多个范围

Expect("2015-05-05T00:00:00||+1d-1m").WhenSerializing(
Nest.DateMath.Anchored(new DateTime(2015,05,05))
.Add("1d")
.Subtract(TimeSpan.FromMinutes(1)));

Fractional times

DateMath 表达式不支持小数,所以会选择一个可以将表达式转换成整数的最大的单位

Expect("now+25h")
.WhenSerializing(Nest.DateMath.Now.Add(TimeSpan.FromHours(25)))
.WhenSerializing(Nest.DateMath.Now.Add(90000000))
.WhenSerializing(Nest.DateMath.Now.Add(new Time(25, Nest.TimeUnit.Hour)))
.WhenSerializing(Nest.DateMath.Now.Add("25h")); Expect("now+90001s").WhenSerializing(
Nest.DateMath.Now.Add(TimeSpan.FromHours(25).Add(TimeSpan.FromSeconds(1)))); Expect("now+90000001ms").WhenSerializing(
Nest.DateMath.Now.Add(TimeSpan.FromHours(25).Add(TimeSpan.FromMilliseconds(1)))); Expect("now+1y")
.WhenSerializing(Nest.DateMath.Now.Add("1y"))
.WhenSerializing(Nest.DateMath.Now.Add(new Time(1, Nest.TimeUnit.Year))); Expect("now+6M")
.WhenSerializing(Nest.DateMath.Now.Add("6M"))
.WhenSerializing(Nest.DateMath.Now.Add("0.5y"))
.WhenSerializing(Nest.DateMath.Now.Add(new Time(0.5, Nest.TimeUnit.Year)))
.WhenSerializing(Nest.DateMath.Now.Add(new Time(6, Nest.TimeUnit.Month))); Expect("now+364d")
.WhenSerializing(Nest.DateMath.Now.Add(TimeSpan.FromDays(7 * 52))); Expect("now+52w")
.WhenSerializing(Nest.DateMath.Now.Add(new Time("52w")))
.WhenSerializing(Nest.DateMath.Now.Add(new Time(52, Nest.TimeUnit.Week)));

NEST 中的日期数学表达式的更多相关文章

  1. [Swift通天遁地]五、高级扩展-(14)扩展String快速计算字符串中的各种数学表达式

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. Oracle中有关数学表达式的语法

    Oracle中有关数学表达式的语法 三角函数 SIN               ASIN              SINHCOS             ACOS           COSHTA ...

  3. 理解CSS中的数学表达式calc()

    前面的话 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路.本文将介绍calc()的相关内容 定义 数学表达式calc()是calculat ...

  4. css中的数学表达式calc()

    前言 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路. 概念 数学表达式calc()是calculate计算的缩写,它允许使用+.-.*. ...

  5. Solr中的日期/时间表示

    摘要: Solr的日期字段(TrieDateField 和DateRangeField)可以对一个时间点以毫秒精度表示. 格式 Solr中的日期有很严格的格式限制: YYYY-MM-DDThh:mm: ...

  6. javascript中关于日期和时间的基础知识

    × 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...

  7. MYSQL 中常用日期时间函数使用

    MySQL Date 函数 下面的表格列出了 MySQL 中最重要的内建日期函数: 函数 描述 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 ...

  8. quartz定时任务中常用的cron表达式

    一:定时cron的格式,一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为: 1.秒(0~59) 2.分钟(0~59) 3.小时(0~23) 4.天(月(0~31,但是你需 ...

  9. shell中的双括号表达式

    语法格式 (( expression )) expression可以是任何数学表达式,可以包含的操作符有: +  加 - 减 * 乘(无需转义) / 除 % 取余 ** 指数 == 等于 != 不等 ...

随机推荐

  1. Markdown中Latex 数学公式基本语法

    原文地址:http://blog.csdn.net/u014630987/article/details/70156489 Markdown中Latex 数学公式基本语法 公式排版 分为两种排版: - ...

  2. hibernate框架学习之数据查询(QBC)helloworld

    package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Criteria; import org.hib ...

  3. v-on 绑定自定义事件

    每个 Vue 实例都实现了事件接口,即: 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件 Vue 的事件系统与浏览器的 EventTarget API  ...

  4. js导出excel增加表头、mso-number-format定义数据格式

    问题1:增加表头 js导出表格时,只会导出table里的展现出的内容,如需增加表头等内容需要在页面获取的字符串中拼接表头的相关字符串,详细介绍如下: tableString:新增的表头内容字符串: c ...

  5. Openssl编程--源码分析

    Openssl编程 赵春平 著 Email: forxy@126.com 第一章 基础知识 8 1.1 对称算法 8 1.2 摘要算法 9 1.3 公钥算法 9 1.4 回调函数 11 第二章 ope ...

  6. windows的tasklist使用

    获取进程信息 tasklist # tasklist |findstr java.exe 杀死进程 方式1,通过进行pid杀死: taskkill /pid 4612 /f 方式2,通过名称杀死: t ...

  7. GPS日常总结

    GPS 上电后,每隔一定的时间就会返回一定格式的数据,数据格式为:$信息类型,x,x,x,x,x,x,x,x,x,x,x,x,x每行开头的字符都是'$',接着是信息类型,后面是数据,以逗号分隔开. 1 ...

  8. Scientific Toolworks Understand

    Scientific Toolworks Understand是一款定位于代码阅读的软件.界面用Qt开发的. 软件特性: 1.支持多语言:Ada, C, C++, C#, Java, FORTRAN, ...

  9. mtu简单说明

    总结:本地的mtu值==网络设备的mtu值是最优的,一般本地和网络设备的默认值都是1500(字节),没什么特殊需求,尽量不要修改 一.什么是 MTU 值   1 从字面上来说,MTU 是英文 Maxi ...

  10. Confluence 6 针对站点维护使用只读模式

    如果你需要对 Confluence 进行维护,但是 Confluence 还是在运行或者你计划将站点合并到一个新的站点,你可以将你的 Confluence 站点设置为只读模式来限制用户在你站点中可以使 ...