如何从DATE类型列中仅获取日期值(去除时分秒后缀)?
解决DATE列查询显示带时间后缀的问题
嘿,这个场景我太熟悉了!虽然你的列定义是DATE类型,但有些数据库客户端或驱动会默认给它补上00:00:00的时间后缀来显示。要只提取纯日期部分,得根据你使用的数据库来调整查询语句,给你几个主流数据库的解决方案:
MySQL/MariaDB:用
DATE()函数直接提取日期部分,返回的还是DATE类型,不会带时间:SELECT Id, project_name, DATE(start_date) AS start_date, DATE(end_date) AS end_date, Team_Id FROM Projects;PostgreSQL:DATE类型本身存储时没有时间,但显示带时间可能是客户端设置问题。可以用
TO_CHAR()强制指定格式(返回字符串),或者用DATE_TRUNC()截断到日期(保持DATE类型):-- 强制格式化为DD.MM.YYYY格式的字符串 SELECT Id, project_name, TO_CHAR(start_date, 'DD.MM.YYYY') AS start_date, TO_CHAR(end_date, 'DD.MM.YYYY') AS end_date, Team_Id FROM Projects; -- 截断到日期维度,保持DATE类型 SELECT Id, project_name, DATE_TRUNC('day', start_date)::DATE AS start_date, DATE_TRUNC('day', end_date)::DATE AS end_date, Team_Id FROM Projects;SQL Server:用
CONVERT()函数指定格式代码(104对应DD.MM.YYYY),或者FORMAT()函数语法更直观:-- CONVERT性能更优,适合大数据量查询 SELECT Id, project_name, CONVERT(VARCHAR, start_date, 104) AS start_date, CONVERT(VARCHAR, end_date, 104) AS end_date, Team_Id FROM Projects; -- FORMAT语法易懂,但性能略差 SELECT Id, project_name, FORMAT(start_date, 'dd.MM.yyyy') AS start_date, FORMAT(end_date, 'dd.MM.yyyy') AS end_date, Team_Id FROM Projects;Oracle:用
TO_CHAR()函数指定目标日期格式即可:SELECT Id, project_name, TO_CHAR(start_date, 'DD.MM.YYYY') AS start_date, TO_CHAR(end_date, 'DD.MM.YYYY') AS end_date, Team_Id FROM Projects;
如果你的需求是保持结果为DATE类型而非字符串,优先用数据库自带的日期截断/提取函数(比如MySQL的DATE()、PostgreSQL的DATE_TRUNC()),这样后续数据处理也更方便。
内容的提问来源于stack exchange,提问作者Sebastian Siedlarz




