数据库 Tips

时间和日期互转

数据库当前时间字符串转时间时间转字符串格式dual 表
MySQLNOW()STR_TO_DATEDATE_FORMAT%Y-%m-%d %H:%i:%s可选
OracleSYSTIMESTAMPSYSDATETO_TIMESTAMPTO_DATETO_CHARYYYY-MM-DD HH24:MI:SS必须用
PostgreSQLCURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPTO_DATETO_TIMESTAMPTO_CHARYYYY-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 可以把时间转换成时间段然后使用&&判断是否重合,第三个参数代表边界范围,即开区间还是闭区间,可选([
前者代表开区间,即不包含边界,后者代表闭区间,包含边界,第一个括号代表开始时间,第二个括号代表结束时间。


持续更新中……

标签: SQL, Tips, 数据库

添加新评论