如何将SQL中日期时间列的秒数统一置为00?
将日期时间列的秒数置为00的实用方法
针对不同主流SQL数据库,这里整理了几种简单高效的实现方式,适合新手快速上手:
SQL Server
方法1:高效截断法(推荐大数据量使用)
利用DATEADD和DATEDIFF组合,直接截断到分钟级别,自动把秒和毫秒置为0:
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, YourDateTimeColumn), 0) AS TruncatedDateTime FROM YourTable;
如果要更新表中的数据:
UPDATE YourTable SET YourDateTimeColumn = DATEADD(MINUTE, DATEDIFF(MINUTE, 0, YourDateTimeColumn), 0);
方法2:格式化字符串法
适合需要固定格式输出的场景,但大数据量下性能不如截断法:
SELECT FORMAT(YourDateTimeColumn, 'yyyy-MM-dd HH:mm:00.000') AS FormattedDateTime FROM YourTable;
MySQL
方法1:日期格式化函数(最简单)
用DATE_FORMAT直接指定格式,强制秒数为00:
SELECT DATE_FORMAT(YourDateTimeColumn, '%Y-%m-%d %H:%i:00.000') AS TruncatedDateTime FROM YourTable;
更新数据的语句:
UPDATE YourTable SET YourDateTimeColumn = STR_TO_DATE(DATE_FORMAT(YourDateTimeColumn, '%Y-%m-%d %H:%i:00.000'), '%Y-%m-%d %H:%i:%s.%f');
(注:STR_TO_DATE是为了保证结果依然是datetime类型,避免变成字符串)
方法2:时间截断法
通过计算秒数取整实现:
SELECT CONCAT(DATE(YourDateTimeColumn), ' ', TIME_FORMAT(SEC_TO_TIME(FLOOR(TIME_TO_SECOND(YourDateTimeColumn)/60)*60), '%H:%i:00.000')) AS TruncatedDateTime FROM YourTable;
PostgreSQL
方法1:截断函数(推荐)
PostgreSQL自带的DATE_TRUNC函数可以直接截断到分钟,秒和微秒自动置0:
SELECT DATE_TRUNC('minute', YourDateTimeColumn)::TIMESTAMP(3) AS TruncatedDateTime FROM YourTable;
(::TIMESTAMP(3)是为了保留三位毫秒,和示例格式一致)
方法2:字符串转换法
先转成指定格式的字符串,再转回datetime类型:
SELECT TO_TIMESTAMP(TO_CHAR(YourDateTimeColumn, 'YYYY-MM-DD HH24:MI:00.000'), 'YYYY-MM-DD HH24:MI:SS.US') AS TruncatedDateTime FROM YourTable;
注意事项
- 如果只是查询展示,用格式化函数足够;如果要更新表中数据,优先选择截断类方法,避免字符串转换带来的性能问题和类型错误。
- 不同数据库的日期函数语法差异较大,要根据自己使用的数据库选择对应方法。
内容的提问来源于stack exchange,提问作者BenUK
相关产品推荐
相关产品推荐

