Skip to content

时间操作

sqala支持SQL标准中常用的时间操作。

时间间隔

Int类型值配合year等扩展方法,创建时间间隔表达式,对应SQL的INTERVAL表达式,然后我们可以用+-操作将时间类型字段和时间间隔计算,返回一个新的时间表达式:

scala
// 查询发帖时间在七天内的帖子
val q =
    from(Post)
        .filter(p => p.createTime >= currentTime() - 1.year)

sqala支持的时间单位有:year, month, day, hour, minute, second

时间间隔在各主流数据库最新版本实测支持程度如下:

数据库类型INTERVAL 支持
PostgreSQL
MySQL
Oracle
SQLServer
SQLite

抽取时间

时间类型表达式配合year等扩展方法用于抽取时间字段中的一个时间单位,对应SQL的EXTRACT表达式,返回数值类型:

scala
val q =
    from(Post).map(p => p.createTime.year)

对于两个时间相减的结果(返回时间间隔),也可以用于抽取其中的时间单位:

scala
val q =
    from(Post).map(p => (currentTimestamp() - p.createTime).year)

抽取时间在各主流数据库最新版本实测支持程度如下:

数据库类型EXTRACT 支持
PostgreSQL
MySQL
Oracle
SQLServer
SQLite

时间重叠

对于两个时间的二元组,overlaps方法判断是否有重叠,对应SQL的OVERLAPS运算符:

scala
val q =
    from(Entity).filter(e => (e.d1, e.d2).overlaps(e.d3, e.d4))

时间重叠在各主流数据库最新版本实测支持程度如下:

数据库类型EXTRACT 支持
PostgreSQL
MySQL
Oracle
SQLServer
SQLite

时间数据类型

sqala默认使用java.time.*下面的时间类型作为内置时间类型,各时间类型的值在生成SQL时规则如下:

时间类型PostgreSQLMySQLOracleSQLServerSQLite
LocalDateDATE '2020-01-01'DATE '2020-01-01'TO_DATE('2020-01-01', 'YYYY-MM-DD')CAST('2020-01-01 00:00:00.123456789' AS DATE)
LocalDateTimeTIMESTAMP '2020-01-01 00:00:00.123456789'TIMESTAMP '2020-01-01 00:00:00.123456789'TO_TIMESTAMP('2020-01-01 00:00:00.123456789', 'YYYY-MM-DD HH24:MI:SS.FF9')CAST('2020-01-01 00:00:00.123456789' AS DATETIME2)
LocalTimeTIME '00:00:00'TIME '00:00:00'
OffsetDateTimeTIMESTAMP WITH TIME ZONE '2020-01-01 00:00:00.123456789 +08:00'TO_TIMESTAMP_TZ('2020-01-01 00:00:00.123456789 +08:00', 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM')CAST('2020-01-01 00:00:00.123456789 +08:00' AS DATETIMEOFFSET)
OffsetTimeTIME WITH TIME ZONE '00:00:00 +08:00'