如何将特定格式的日期字符串转换为日期并提取DATEPART?
嘿Ziad,这个问题得先把那个有点特殊的日期字符串转成数据库能识别的日期时间类型,之后就能轻松提取你要的分钟、日期这些部分啦!下面分几种常见的数据库给你具体解法:
SQL Server 解法
SQL Server里可以用TRY_PARSE直接识别这种英文格式的日期,指定英文区域就能正确解析,之后用DATEPART或者CONVERT提取需要的部分:
-- 提取分钟 SELECT DATEPART(MINUTE, TRY_PARSE('Tue Nov 8 06:14:57 GMT 2016' AS DATETIME USING 'en-US')) AS [Minute] -- 提取纯日期部分(比如得到2016-11-08) SELECT CONVERT(DATE, TRY_PARSE('Tue Nov 8 06:14:57 GMT 2016' AS DATETIME USING 'en-US')) AS [DatePart] -- 提取日 SELECT DATEPART(DAY, TRY_PARSE('Tue Nov 8 06:14:57 GMT 2016' AS DATETIME USING 'en-US')) AS [Day]
如果你的SQL Server版本比较老(2012之前)不支持TRY_PARSE,可以先把字符串里的GMT替换掉,再用CONVERT解析:
SELECT DATEPART(DAY, CONVERT(DATETIME, REPLACE('Tue Nov 8 06:14:57 GMT 2016', ' GMT ', ' '))) AS [Day]
MySQL 解法
MySQL用STR_TO_DATE函数,你需要指定和字符串匹配的格式模板,之后就能用日期函数提取部分:
-- 提取分钟(用DATEPART或者MINUTE函数都可以) SELECT MINUTE(STR_TO_DATE('Tue Nov 8 06:14:57 GMT 2016', '%a %b %e %H:%i:%s GMT %Y')) AS `Minute` -- 提取纯日期部分 SELECT DATE(STR_TO_DATE('Tue Nov 8 06:14:57 GMT 2016', '%a %b %e %H:%i:%s GMT %Y')) AS `DatePart` -- 提取日 SELECT DAY(STR_TO_DATE('Tue Nov 8 06:14:57 GMT 2016', '%a %b %e %H:%i:%s GMT %Y')) AS `Day`
这里的格式符对应:%a是缩写星期名,%b是缩写月份名,%e是不带前导零的日,%H是24小时制小时,%i是分钟,%s是秒,%Y是4位年份。
PostgreSQL 解法
PostgreSQL用TO_TIMESTAMP函数解析字符串,之后用EXTRACT或者直接转换类型来提取:
-- 提取分钟 SELECT EXTRACT(MINUTE FROM TO_TIMESTAMP('Tue Nov 8 06:14:57 GMT 2016', 'Dy Mon DD HH24:MI:SS GMT YYYY')) AS "Minute" -- 提取纯日期部分 SELECT TO_TIMESTAMP('Tue Nov 8 06:14:57 GMT 2016', 'Dy Mon DD HH24:MI:SS GMT YYYY')::DATE AS "DatePart" -- 提取日 SELECT EXTRACT(DAY FROM TO_TIMESTAMP('Tue Nov 8 06:14:57 GMT 2016', 'Dy Mon DD HH24:MI:SS GMT YYYY')) AS "Day"
格式符里Dy对应缩写星期名,Mon对应缩写月份名,HH24是24小时制小时,MI是分钟,完全匹配你的字符串格式。
核心思路其实都是先把自定义格式的字符串转成数据库原生的日期时间类型,之后就可以用对应的日期函数提取任何你需要的部分啦!
内容的提问来源于stack exchange,提问作者Ziad Salem
相关产品推荐
相关产品推荐

