NEST 中的日期数学表达式
2024-08-29 11:17:05
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)));
最新文章
- 精选9个值得学习的 HTML5 效果【附源码】
- [BUG集] android 安卓项目中ORMLITE框架 Must specify one of id, generatedId, and generatedIdSequence with Id
- nodejs学习篇 (1)webstorm创建nodejs + express + jade 的web 项目
- javascript 数组去重
- 安卓集成发布详解(二)gradle
- RabbitMQ介绍1 - 由来
- phpcms v9用get-sql调用数据表中的图组图片示例代码
- [转] Console命令详解,让调试js代码变得更简单
- iOS实现文件上传功能模块
- 更新ADT到Android L的方法
- OpenCV学习2-----使用inpaint函数进行图像修复
- windows 结束进程的详细过程
- Edge-assisted Traffic Engineering and applications in the IoT
- Ansible第二章:palybook介绍与使用--小白博客
- Tomcat设计模式
- 关于jenkins旧的构建导致磁盘空间不足问题
- 螺旋折线|2018年蓝桥杯B组题解析第七题-fishers
- [Java学习] Java异常处理基础
- 在chrome中安装基于REST的web服务客户端
- Questions(Updating)
热门文章
- spring集成cxf实现webservice接口功能
- HDU - 2665 Kth number 主席树/可持久化权值线段树
- <;TCP/IP>;ICMP报文的分类
- JavaScript 加解密库(crypto-js)
- Codeforces 1093E Intersection of Permutations [CDQ分治]
- css一些基础效果
- Oracle 所有的权限列表
- Confluence 6 识别慢性能的宏
- Confluence 6 订阅所应用的所有小工具
- 单击列表行前边的checkbox被选中,再单击,取消选中