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. window.opener和window.open的使用

    window.opener和window.open的使用 window.opener是指调用window.open方法的窗口.window.opener 返回的是创建当前窗口的那个窗口的引用,比如点击 ...

  2. struts2框架之标签

    标签 1. <s:property> * default:默认值,例如:<s:property value="name" default="不存在&qu ...

  3. Mudo C++网络库第五章学习笔记

    高效的多线程日志 日志(logging)有两个意思: 诊断日志(diagnostic log), 常用日志库提供日志功能; 交易日志(transaction log), 用于记录状态变更, 通过回放日 ...

  4. expect学习笔记及实例详解

    因为最近正在学习expect脚本,但是发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的 ...

  5. percona mysql5.7关闭审计功能方法

    数据库的审计日志占用大量空间,当时是为了测试审计功能开启的,现在需要关闭 # /data/mysql_data]# du -sh * 124G audit.log # 查询审计相关参数 mysql&g ...

  6. mysql管理工具percona-toolkit-3简单使用介绍

    安装percona-toolkit-3 # -.el6.x86_64.rpm :.el6 -y 1.pt-summary #显示和系统相关的基本信息: [root@master ~]# pt-summ ...

  7. https openssl http2

    2018-3-21 10:27:45 星期三 参考: 对https, http2的解释 总结: 生成自有证书(非第三方证书颁发公司) 我使用的是gitbash工具, 命令为: $ openssl re ...

  8. 压缩JS的eclipse插件

    主页:http://jscompressor.oncereply.me/ Update site: http://jscompressor.oncereply.me/update/

  9. bootstrap的treeview使用方法

    首先引入文件: <link href="./css/bootstrap.css" rel="stylesheet"> <script src= ...

  10. mysql-约束介绍

    一.约束介绍 约束是一种限制,它通过对表的行或列的数据做出限制,来确保数据的完整性.一致性.约束条件与数据类型宽度一样都是可选参数. 常用约束: PRIMARY KEY (PK) 标识该字段为该表的主 ...