多列日期比较:如何获取数据表中每行的最小日期
解决每行多日期字段取最小值的问题
嘿,我明白你遇到的困扰了——想从每行的多个日期字段里揪出最小值,但用LEAST()函数没拿到预期结果。这大概率是不同数据库对日期处理或函数支持的差异导致的,下面分几种常见数据库给你对应的解决方案:
1. MySQL / MariaDB
如果你的日期字段是DATE/DATETIME类型,LEAST()其实是能正常工作的。要是没得到正确结果,可能是字段存成了字符串(比如VARCHAR),这时候得先把字符串转成日期类型再比较:
SELECT Id, LEAST(STR_TO_DATE(Date_1, '%Y/%m/%d'), STR_TO_DATE(Date_2, '%Y/%m/%d')) AS Min_date FROM your_table_name;
要是字段本身就是日期类型,直接用LEAST()就搞定:
SELECT Id, LEAST(Date_1, Date_2) AS Min_date FROM your_table_name;
2. SQL Server
SQL Server没有内置的LEAST()函数,给你两种实现方式:
方式一:用IIF函数(适合两个字段的情况)
SELECT Id, IIF(Date_1 < Date_2, Date_1, Date_2) AS Min_date FROM your_table_name;
方式二:转成行后取最小值(字段多的时候更灵活)
SELECT Id, (SELECT MIN(dt) FROM (VALUES (Date_1), (Date_2)) AS Dates(dt)) AS Min_date FROM your_table_name;
3. PostgreSQL
PostgreSQL支持LEAST()函数,不管字段是日期类型还是格式规范的字符串(它会自动隐式转换),直接用就行:
SELECT Id, LEAST(Date_1, Date_2) AS Min_date FROM your_table_name;
4. Oracle
Oracle同样支持LEAST()函数,直接调用就能得到结果:
SELECT Id, LEAST(Date_1, Date_2) AS Min_date FROM your_table_name;
为啥你原来的语句可能失效?
- 字段类型问题:如果
Date_1和Date_2是字符串类型,且数据库没自动转换日期的逻辑,LEAST()会按字符串字典序比较,容易得出错误结果(比如日期格式是DD/MM/YYYY时,字符串比较就会乱套)。 - 数据库不支持
LEAST():比如SQL Server就没有这个函数,直接用会报错。
用上面对应的方法,就能得到你想要的结果:
Id Min_date
1 2021/03/15
2 2021/08/21
3 2021/07/02
内容的提问来源于stack exchange,提问作者Jaol
相关产品推荐
相关产品推荐

