数据库 Tips

数据库 Tips

时间和日期互转

数据库 当前时间 字符串转时间 时间转字符串 格式 dual 表
MySQL NOW() STR_TO_DATE DATE_FORMAT %Y-%m-%d %H:%i:%s 可选
Oracle SYSTIMESTAMPSYSDATE TO_TIMESTAMPTO_DATE TO_CHAR YYYY-MM-DD HH24:MI:SS 必须用
PostgreSQL CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP TO_DATETO_TIMESTAMP TO_CHAR YYYY-MM-DD HH24:MI:SS 不能用

数据库迁移

迁移到 PostgreSQL

可以使用 pgloader,有 Docker 镜像:dimitri/pgloader

图形化工具

  • a5m2:全称「A5:SQL MK-2」,一个日本人开发的图形化工具,直接在数据库上右键,然后选择Data Transfer...就可以了,可以选择不同的数据库类型。
  • navicat:只能迁移相同类型的数据库,比如 mysql -> mysql,或者 pgsql -> pgsql。

MySQL

创建数据库并指定字符集

并不难,只不过用的比较多,记下来

CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

时间和字符串互转

STR_TO_DATEDATE_FORMAT,转换格式:%Y-%m-%d %H:%i:%s

Oracle

(+) 符号

这种是旧写法,oracle 已经不再推荐

详情可见https://stackoverflow.com/a/47008794/17746262

在 Oracle 中,(+) 表示 JOIN 中的“可选”表。

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

现代写法就是:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

创建序列

-- 创建序列
create sequence seq_newsId
-- 删除序列
DROP SEQUENCE seq_newsId

PostgreSQL

判断时间重合

使用tsrange函数:

select * from example
where tsrange(start_time, end_time, '()') && tsrange(start_time2, end_time2, '()')

解释:tsrange 可以把时间转换成时间段然后使用&&判断是否重合,第三个参数代表边界范围,即开区间还是闭区间,可选([
前者代表开区间,即不包含边界,后者代表闭区间,包含边界,第一个括号代表开始时间,第二个括号代表结束时间。


持续更新中……

posted @ 2024-02-28 16:28  code-blog  阅读(21)  评论(0编辑  收藏  举报