pgSQL,时间类型timestamp结合mybatis小记

本文探讨了在SpringBoot与MyBatis框架下,如何优化基于时间的数据库查询,包括精确到天的单日查询和日期区间查询,通过SQL语句的巧妙设计,实现了高效的数据检索。

背景:项目是用springboot+mybatis重构的,原先是用spring.数据库使用的是pgSQL一开始就统一时间参数接收和数据库都使用timestamp类型,后期带来了不算太大的麻烦

需求一,查询所有的项目表数据,查询条件有具体某一天新建的项目

SELECT

            p_id,p_name,create_time from project

                WHERE

                     1=1      

<if test="createTime != null and createTime != '' ">
    AND to_char(create_time, 'YYYY-MM-DD') = to_char(to_date(#{createTime},'YYYY-MM-DD'), 'YYYY-MM-DD')
</if>

上面是查询出哪些字段,下面的if标签是mybatis判断,如果时间没有给就不执行if标签里的sql语句,

createTime是传递进来的参数,create_time是数据库字段数据,

timestamp是时间戳,一般长这样1564651689000,java底层是字符串.

首先to_date(#{createTime},'YYYY-MM-DD') 我要传递进来的时间参数转换成date类型

to_char(to_date(#{createTime},'YYYY-MM-DD'), 'YYYY-MM-DD')  再然后把它转换成字符类型'YYYY-MM-DD'格式

最后一步就是把数据库的字段转换成字符类型和传递进来的参数字符类型比较.

to_char(create_time, 'YYYY-MM-DD') = to_char(to_date(#{createTime},'YYYY-MM-DD'), 'YYYY-MM-DD')

总结:其实思路你也应该能明白了.我把参数时间转换成时间格式的Date,再按照一个格式转换成字符.再把数据库的时间转换成字符进行比较,数据库的字符比较不就是'='嘛!

上面的问题解决了,那么又一个新需求来了.产品狗说我不想要某一天的了,我想要一个区间内的,精确到 /天,心里一万只草拟吗

需求二,查询所有的项目表数据,查询条件有具体某一天到某一天的区间内项目

SELECT

            p_id,p_name,create_time from project

                WHERE

                     1=1     

<if test=" startTime != null and endTime != null ">
    AND to_date(to_char(create_time, 'YYYY-MM-DD') , 'YYYY-MM-DD')
    BETWEEN
    to_date(#{startTime}, 'YYYY-MM-DD' )
    AND
    to_date(#{endTime}, 'YYYY-MM-DD' )
</if>

好,这里我们就不废话了,和上面一样.但是这是次传各位2个参数,开始时间和结束时间.

思考:上面第一个需求是查某一天,我格式化成字符比较.那么现在区间我再格式化成字符用=来比较完全不对的.那只能在这两个时间的区间内.如果是数字用>/<比较.其实上面已经有答案了,直接比较时间.

我先把传递进来的2个时间转换成固定格式的date,用 BETWEEN ... AND来做(在.....之间)翻译过来就是,在开始时间和结束时间区间

<think>好的,我现在需要帮助用户在PostgreSQL中为timestamp类型的字段设置默认值为当前时间。首先,我得回想一下PostgreSQL中处理时间戳和默认值的相关知识。 我记得在PostgreSQL中,设置默认值通常是在创建表或者修改表结构的时候使用DEFAULT关键字。对于时间戳,可能需要用到特定的函数来获取当前时间。常见的函数有CURRENT_TIMESTAMP和now(),这两个函数应该都能返回当前的时间戳。 用户提到的是timestamp类型,要注意PostgreSQLtimestamp with time zone和timestamp without time zone两种类型。不过用户的问题里没有特别说明时区,所以可能默认使用timestamp without time zone,或者根据数据库的设置而定。不过设置默认值的语法可能不区分这两种类型,只需要正确使用函数即可。 接下来,我需要确认如何具体在创建表的时候添加这样的字段。例如,在CREATE TABLE语句中,字段定义应该是这样的: CREATE TABLE example ( id SERIAL PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); 这里,created_at字段的默认值被设置为CURRENT_TIMESTAMP,这样在插入新记录时,如果没有指定created_at的值,就会自动填入当前时间。 另外,如果用户已经有一个存在的表,需要修改现有字段来添加默认值,可以使用ALTER TABLE语句。例如: ALTER TABLE example ALTER COLUMN created_at SET DEFAULT CURRENT_TIMESTAMP; 这会将created_at字段的默认值设为当前时间。需要注意的是,这个修改不会影响已有的数据,只对新插入的数据生效。 用户提供的引用中有提到批量修改timestamp with time zone类型的字段为timestamp类型的例子,可能涉及到模式中的多个表。不过用户当前的问题只是设置默认值,所以可能不需要那么复杂的脚本,但如果有多个字段需要设置,可能需要类似的循环处理。不过用户的问题可能更简单,只需要单个字段的设置。 另外,引用中还提到PostgreSQL支持特殊的时间戳值,但这里用户的需求是当前时间,所以应该使用标准的函数。 需要确认是否有其他需要注意的地方,比如函数是否在触发器等情况下有不同表现。但一般来说,CURRENT_TIMESTAMP和now()在默认值中是可靠的。 总结步骤: 1. 在创建表时,使用DEFAULT CURRENT_TIMESTAMP或DEFAULT now()来设置默认时间戳。 2. 对于已存在的表,使用ALTER TABLE语句修改字段的默认值。 3. 验证默认值是否生效,可以通过插入数据不指定该字段的值来测试。 可能用户还会问时区的问题,比如是否需要带时区的timestamp,这时候类型应为TIMESTAMPTZ,但默认值的设置方式是一样的。例如: created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP 但根据用户的问题描述,他们可能只需要普通的timestamp类型,所以不需要特别处理时区。 最后,确保给出的示例正确,并且语法无误。可能需要提醒用户注意TIMESTAMP类型是否带时区,以及根据实际需求选择合适的类型。</think>在 PostgreSQL 中为 `timestamp` 类型字段设置默认值为当前时间,可通过以下步骤实现: --- ### **1. 创建表时设置默认值** 在表定义语句中,使用 `DEFAULT CURRENT_TIMESTAMP` 或 `DEFAULT NOW()` 直接指定字段的默认值: ```sql CREATE TABLE example_table ( id SERIAL PRIMARY KEY, created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 普通 timestamp 类型 modified_time TIMESTAMPTZ DEFAULT NOW() -- 带时区的 timestamp 类型 ); ``` - `CURRENT_TIMESTAMP` 和 `NOW()` 均返回当前时间戳,区别在于 `CURRENT_TIMESTAMP` 可以接受精度参数(如 `CURRENT_TIMESTAMP(0)` 表示精确到秒)[^1]。 - `TIMESTAMPTZ` 类型会自动转换时区,而 `TIMESTAMP` 类型不会。 --- ### **2. 修改已有表字段** 若需为已存在的字段添加默认值,使用 `ALTER TABLE` 语句: ```sql ALTER TABLE example_table ALTER COLUMN created_time SET DEFAULT CURRENT_TIMESTAMP; ``` - 此操作仅对新插入的数据生效,不会修改已有数据。 --- ### **3. 验证默认值** 插入数据时不指定时间字段,验证默认值是否生效: ```sql INSERT INTO example_table (id) VALUES (1); SELECT * FROM example_table WHERE id = 1; ``` 结果中 `created_time` 和 `modified_time` 字段应自动填充为插入时的系统时间。 --- ### **关键区别说明** | 类型 | 行为 | 适用场景 | |-----------------------|----------------------------------------------------------------------|------------------------------| | `TIMESTAMP` | 存储时间戳,不包含时区信息 | 需要固定时区的场景(如日志) | | `TIMESTAMPTZ` | 存储时间戳并自动转换时区,实际以 UTC 形式存储 | 跨时区应用 | | `DEFAULT CURRENT_TIMESTAMP` | 插入时自动填充当前时间,支持普通 `TIMESTAMP` 和 `TIMESTAMPTZ` 类型 | 通用场景 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值