You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL中FLIGHT表插入指定AM/PM格式时间的技术咨询

SQL中FLIGHT表插入指定AM/PM格式时间的技术咨询

嗨,看起来你混淆了数据存储显示格式这两个核心关键点,咱们一步步拆解解决这个问题:

核心原则:别把格式存在数据库里

数据库的时间类型(比如TIME/DATE/TIMESTAMP)是用来存储时间的逻辑值,不是为了直接存带AM/PM的字符串。正确的思路是:用合适的时间类型存储时间值,查询的时候再格式化成你想要的7:00AM样式。

第一步:选对存储数据类型

从你提到的TO_TIMESTAMP01-JUL-23输出来看,你大概率用的是Oracle数据库(它没有单独的TIME类型,DATETIMESTAMP都包含日期+时间部分):

  • 若只需要存储时间(日期部分不重要),用DATE类型就足够(Oracle的DATE默认包含时分秒);
  • 要是需要更高精度的时间,就用TIMESTAMP类型。

如果是其他数据库:

  • MySQL有单独的TIME类型,专门存储不带日期的时间;
  • PostgreSQL可以用TIMETIMESTAMP,根据需求选择即可。

第二步:正确插入时间值

以Oracle为例,用TO_DATE函数把带AM/PM的字符串转成DATE类型插入:

INSERT INTO FLIGHT (flightArrival, flightDeparture)
VALUES (
    TO_DATE('7:00 AM', 'HH:MI AM'),  -- 转换为日期+时间,日期默认是当月第一天
    TO_DATE('2:00 PM', 'HH:MI AM')
);

如果是MySQL,直接用STR_TO_DATE转换插入:

INSERT INTO FLIGHT (flightArrival, flightDeparture)
VALUES (
    STR_TO_DATE('7:00 AM', '%h:%i %p'),
    STR_TO_DATE('2:00 PM', '%h:%i %p')
);

第三步:查询时格式化输出

这才是得到你想要的7:00AM样式的关键!

  • Oracle用TO_CHAR函数格式化:
SELECT 
    TO_CHAR(flightArrival, 'HH:MI AM') AS flightArrival,
    TO_CHAR(flightDeparture, 'HH:MI AM') AS flightDeparture
FROM FLIGHT;
  • MySQL用DATE_FORMAT
SELECT 
    DATE_FORMAT(flightArrival, '%h:%i %p') AS flightArrival,
    DATE_FORMAT(flightDeparture, '%h:%i %p') AS flightDeparture
FROM FLIGHT;
  • PostgreSQL用TO_CHAR
SELECT 
    TO_CHAR(flightArrival, 'HH12:MI AM') AS flightArrival,
    TO_CHAR(flightDeparture, 'HH12:MI AM') AS flightDeparture
FROM FLIGHT;

为啥你之前的方法不对?

  • TIME类型没效果:如果是Oracle,它根本没有单独的TIME类型,所以会报错或自动转成其他类型;
  • TO_TIMESTAMP得到带日期的结果:因为TIMESTAMP本身包含日期部分,Oracle会自动补一个默认日期(比如当月第一天),但这完全不影响后续查询时格式化输出时间。

避坑提醒

千万别用VARCHAR类型存储时间!这样你没法做任何时间相关的运算(比如计算飞行时长、排序航班时间),还容易出现格式错误的脏数据。

备注:内容来源于stack exchange,提问作者user22259416

火山引擎 最新活动