SQL中FLIGHT表插入指定AM/PM格式时间的技术咨询
SQL中FLIGHT表插入指定AM/PM格式时间的技术咨询
嗨,看起来你混淆了数据存储和显示格式这两个核心关键点,咱们一步步拆解解决这个问题:
核心原则:别把格式存在数据库里
数据库的时间类型(比如TIME/DATE/TIMESTAMP)是用来存储时间的逻辑值,不是为了直接存带AM/PM的字符串。正确的思路是:用合适的时间类型存储时间值,查询的时候再格式化成你想要的7:00AM样式。
第一步:选对存储数据类型
从你提到的TO_TIMESTAMP和01-JUL-23输出来看,你大概率用的是Oracle数据库(它没有单独的TIME类型,DATE和TIMESTAMP都包含日期+时间部分):
- 若只需要存储时间(日期部分不重要),用
DATE类型就足够(Oracle的DATE默认包含时分秒); - 要是需要更高精度的时间,就用
TIMESTAMP类型。
如果是其他数据库:
- MySQL有单独的
TIME类型,专门存储不带日期的时间; - PostgreSQL可以用
TIME或TIMESTAMP,根据需求选择即可。
第二步:正确插入时间值
以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




