如何提取日期中第二个'/'左侧内容(仅保留月日部分)
提取日期字段中的月日部分的几种方案
这个问题我之前帮朋友解决过,确实用LEFT()函数会因为日期格式长度不一致踩坑,比如短月份/日期的情况就会多截到年份的字符。下面给你几种靠谱的方法,分场景来说:
场景1:日期字段是字符串类型
如果你的日期存在字符串字段里(比如varchar类型),可以用SUBSTRING结合CHARINDEX精准截取到第二个斜杠之前的内容:
SUBSTRING(date_column, 1, CHARINDEX('/', date_column, CHARINDEX('/', date_column) + 1) - 1)
原理拆解:
- 第一个
CHARINDEX('/', date_column)找到第一个斜杠的位置(比如5/5/2018里第一个/在第2位) - 第二个
CHARINDEX('/', date_column, 位置+1)从第一个斜杠的下一位开始找第二个斜杠的位置(比如5/5/2018里第二个/在第4位) - 最后用
SUBSTRING截取从第1位到第二个斜杠前一位的内容,就能得到5/5或者10/12
另外还有个小技巧,用REPLACE配合PARSENAME(适合SQL Server这类支持PARSENAME的数据库):
SELECT PARSENAME(REPLACE(date_column, '/', '.'), 3) + '/' + PARSENAME(REPLACE(date_column, '/', '.'), 2) AS month_day
原理是把斜杠换成点,用PARSENAME按点分割字符串,取第3段(月)和第2段(日)拼接起来。
场景2:日期字段是日期类型(推荐)
如果你的字段本身是date/datetime类型,那直接用数据库自带的格式化函数更稳妥,不会因为字符串格式异常出问题:
- SQL Server:用
FORMAT函数,指定格式'M/d'(自动去掉前导零)SELECT FORMAT(date_column, 'M/d') AS month_day - MySQL:用
DATE_FORMAT,格式符%c/%e(%c是无前导零的月份,%e是无前导零的日期)SELECT DATE_FORMAT(date_column, '%c/%e') AS month_day - PostgreSQL:用
TO_CHAR,搭配FM修饰符去掉前导零SELECT TO_CHAR(date_column, 'FMMM/FMDD') AS month_day
不管哪种场景,都能精准得到你想要的'10/12'或'5/5'格式~
内容的提问来源于stack exchange,提问作者kodym
相关产品推荐
相关产品推荐

