- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 Nest.js 框架实现基本的酒店预订系统。
我使用 TypeOrm 和 Postgres 数据库。
我有一个预订实体(酒店房间预订)
和 Booking 应该有一个 DateRange(从入住到退房日期)。
我找不到如何在 TypeOrm 中使用 DateRange 对象类型。
@Entity({ name: 'booking' })
export class Booking{
@PrimaryGeneratedColumn()
id: number;
@Column({
type: 'daterange', // I expect to find DateRange type here
})
date_range: any;
}
任何的想法?
最佳答案
日期范围类型作为字符串读取并作为字符串写入。您需要使用/解析 postgres range type 的正确字符串表示.
为了使解析更容易,您可以在表上添加约束以仅允许包含范围。将此装饰器添加到类中:
@Check('booking_range_valid', 'NOT isempty(range) AND lower_inc(range) AND NOT upper_inc(range)')
您需要编写自己的转换器,将 Postgres 日期范围值转换为间隔表示。如果您使用 Luxon 间隔,您可以使用:
// Just a small helper to make transformers work with find operators
export const fixTransformer = (transformer: ValueTransformer) => ({
to(value: unknown) {
if (value instanceof FindOperator) {
return new FindOperator(value.type , transformer.to(value.value),
value.useParameter, value.multipleParameters);
} else {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return transformer.to(value);
}
},
from(value: unknown) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return transformer.from(value);
}
})
import {DateTime, Interval} from 'luxon';
// Postgres daterange string representation. [ means that start day is included, ) that end day is not.
const pattern = /\[(\d{4}-\d{2}-\d{2}),\s*(\d{4}-\d{2}-\d{2})\)/;
export const dateRangeIntervalTransformer = fixTransformer({
to(value: Interval | undefined): string | undefined {
if (value !== undefined && !value.isValid) {
throw new Error(`Got an invalid daterange, reason was ${value.invalidReason || '?'}`);
}
if (value) {
if (!value.start.startOf('day').equals(value.start)) {
throw new Error('Start of daterange needs to be the start of the day.');
}
if (!value.end.startOf('day').equals(value.end)) {
throw new Error('End of daterange needs to be the start of the day.');
}
return '[' + value.start.toISODate() + ',' + value.end.toISODate() + ')';
} else {
return undefined;
}
},
from(value: string | undefined): Interval | undefined {
if (value) {
const match = pattern.exec(value);
if (!match) {
throw new Error(`Date range does not match pattern ${pattern.source}: ${value}`);
}
return Interval.fromDateTimes(
DateTime.fromISO(match[1]).startOf('day'),
DateTime.fromISO(match[2]).startOf('day'));
} else {
return undefined;
}
}
});
然后在您的实体中使用它:
@Entity({ name: 'booking' })
@Check('booking_range_valid', 'NOT isempty(range) AND lower_inc(range) AND NOT upper_inc(range)')
export class Booking{
@PrimaryGeneratedColumn()
id: number;
@Column({
type: 'daterange',
nullable: false, // < If you allow null, change the converter to handle null values
transformer: dateRangeIntervalTransformer
})
date_range = Interval.after(DateTime.local().startOf('day'), {days: 1}); // < default value
}
关于postgresql - 我如何将 Postgres DateRange 类型与 TypeOrm 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58588463/
我需要更改 DATERANGE 列的范围。默认值为 bounds='[)'。 这是我当前的专栏: from sqlalchemy.dialects.postgresql import DATERANG
我从客户端发送文档查询,其中currentDate在附加到所有文档的两个值之间。该文档具有expireDate和availableDate。 如何制定此查询?推测我想出了以下方法,但不起作用: {
以this为例,我想到了以下查询。我没有得到任何结果,但是如果我将“01/01/2017”替换为“null”,那么我会得到记录(全部来自2014年,因此我知道它应该返回数据)。谁能帮我吗? var
我有一个简单的表,它有一个带有日期类型的 user_birthday 字段(可以是空值) CREATE TABLE users ( user_id bigserial NOT NULL, us
我在调用数据库中的存储过程时遇到问题 这是我数据库中的存储过程 DELIMITER $$ USE `sample`$$ DROP PROCEDURE IF EXISTS `sp_ReturnAtten
我的一些域对象包含日期范围作为一对开始和结束日期属性: public class Period { public DateTime EffectiveDate { get; set; } pu
有没有办法在 Shiny 中破解或创建一个 dateRangeInput() 选择器,以便它仅选择月年(没有日期),或者自动选择所选月份的第一天,而不需要显示一天的选择?或者我应该创建另一个月日期选择
我看不出如何创建一个以 infinity 作为上限的日期范围。 Postgres 将两个输入都转换为独占上限: create table dt_overlap ( id serial prim
我有两个表,每个表都有相同的 ID,从第一次加入成员(member)开始。 一旦成员被批准,他/她也会因某些原因和条件而被拒绝。 查询结果需要按日期范围排序,然后根据所选 ID 的每个日期计算批准总数
我正在尝试将日期范围选择器添加到我的 html 文件中,但是当我单击输入框时无法显示它。它适用于日期选择器,但我希望它提供点击日期范围的功能。几天来我一直在努力解决这些问题,真的需要一些帮助。提取的代
我在 PostgreSQL(9.3) 中有一张表 daterange字段类型。 我可以像使用 JDBC 的字符串一样选择这个字段,但我不能将它插入到表中。 我尝试过的: PreparedStateme
我的报告页面的要求是:默认日期开始 = 每月 1 日(完成)默认日期结束 = 今天的日期(完成) 由于我们不希望应用程序因数据而崩溃,因此日期范围不应超过 30 天。我无法实现这一部分。没有最短日期,
我有一个非常棘手的问题,我现在正试图弄清楚它, 我有这个查询结果集 SELECT * FROM Orders OrderID | OrderAmount | OrderDate | E
我在 Python 和 Pandas 中工作,需要将一个日期范围划分为多个日期范围 - 并且需要这些范围的开始日期和结束日期 所以像这样: pd.date_range(start='20180301'
我有以下数据框: name from amount days A 7/31/18 200 1 B 7/31/18 300
有什么简单的方法可以将数据表切片为一个范围并对一个范围的计数求和吗? 假设我有以下数据表 Date Count 5/9/2016 5 5/10/2016 1 5/11/2016 2
我有以下类(class) public class DateRange { private DateTime startDate; private DateTime endDate;
我在 pg (postgresql) 中使用 "sequelize": "^2.0.0-rc3",此时我正在尝试使用日期范围进行原始查询,但 sequelize 不返回数据。 当我在 postgres
我有一个包含多年记录的数据框: WarName | StartDate | EndDate ----------------------------------------
查看 vue2-daterange-picker 示例在 https://innologica.github.io/vue2-daterange-picker/#usage 请问Clear按钮是如何实
我是一名优秀的程序员,十分优秀!