SQL Server 2012中Windows计数器表char转datetime失败求助
解决SQL Server 2012中Char类型时间戳转Datetime的报错问题
嘿,我太懂这种转换报错的糟心了!Perfmon自动生成的表经常搞这种“非主流”的时间格式存储,咱们一步步来搞定它:
第一步:先搞清楚你的时间戳字符串到底是什么格式
首先得确认Char字段里的时间长啥样,比如是20240520143000(yyyyMMddHHmmss)还是05/20/2024 14:30:00(MM/dd/yyyy HH:mm:ss),跑这条SQL查几个样本:
SELECT TOP 10 YourTimestampColumn FROM YourPerfmonTable;
第二步:根据格式选对应的转换方法
情况1:标准格式但SQL Server没自动识别
如果是常见的标准格式,用CONVERT函数指定样式号就行,比如:
- 要是格式是
yyyy-MM-dd HH:mm:ss(ODBC标准):CONVERT(DATETIME, YourTimestampColumn, 120) - 要是美国格式
MM/dd/yyyy HH:mm:ss:CONVERT(DATETIME, YourTimestampColumn, 101)
常用样式号我给你列几个:
- 100:默认的
mon dd yyyy hh:miAM(或PM) - 121:带毫秒的
yyyy-MM-dd HH:mm:ss.mmm
情况2:非标准格式(比如无分隔符的yyyyMMddHHmmss)
这种就得先拆分字符串再拼接成标准格式,再转换。比如针对20240520143000:
TRY_CONVERT(DATETIME, SUBSTRING(YourTimestampColumn, 1, 4) + '-' + -- 年 SUBSTRING(YourTimestampColumn, 5, 2) + '-' + -- 月 SUBSTRING(YourTimestampColumn, 7, 2) + ' ' + -- 日 SUBSTRING(YourTimestampColumn, 9, 2) + ':' + -- 时 SUBSTRING(YourTimestampColumn, 11, 2) + ':' + -- 分 SUBSTRING(YourTimestampColumn, 13, 2) -- 秒 )
情况3:存在脏数据(部分字符串根本不是有效时间)
这时候别用CONVERT,改用TRY_CONVERT!SQL Server 2012开始支持这个函数,它会在转换失败时返回NULL,而不是直接让整个视图报错。比如:
TRY_CONVERT(DATETIME, YourTimestampColumn, 120) AS ConvertedTimestamp
之后你还能排查哪些是脏数据:
SELECT YourTimestampColumn FROM YourPerfmonTable WHERE TRY_CONVERT(DATETIME, YourTimestampColumn, 120) IS NULL;
第三步:把转换逻辑写到视图里
举个完整的例子,假设你的表叫PerfmonRawData,时间戳列是PerfTimestamp(格式是yyyyMMddHHmmss),视图可以这么写:
CREATE VIEW vw_PerfmonCleanData AS SELECT TRY_CONVERT(DATETIME, SUBSTRING(PerfTimestamp, 1, 4) + '-' + SUBSTRING(PerfTimestamp, 5, 2) + '-' + SUBSTRING(PerfTimestamp, 7, 2) + ' ' + SUBSTRING(PerfTimestamp, 9, 2) + ':' + SUBSTRING(PerfTimestamp, 11, 2) + ':' + SUBSTRING(PerfTimestamp, 13, 2) ) AS PerfDatetime, CounterName, CounterValue, MachineName FROM PerfmonRawData;
这样就能在视图里得到可用的Datetime类型时间戳啦!
内容的提问来源于stack exchange,提问作者ewanc
相关产品推荐
相关产品推荐

