MSSQL句柄/拆分未知日期字符串格式

时间:2017-05-03 09:16:05

标签: sql-server tsql datetime sql-convert

服务器类型:MSSQL 2014

我的字符串:VARCHAR'2 / 05/2017 7:54:51 PM'

我需要将其转换为任何支持的DateTime格式(或者最好直接转换为纪元)。 它需要处理NULL和“”(空白)行。

我花了几个小时拖网搜索答案和Google无济于事。令人沮丧的是存储的格式与日期格式131略有不同。

我尝试过这样的事情;

FORMAT(CONVERT(DATETIME, '2/05/2017 7:54:51 PM'), 'dd/MM/yyyy hh:mm:ss')
CONVERT(DATETIME, '2/05/2017 7:54:51 PM',22)
CONVERT(DATETIME, '2/05/2017 7:54:51 PM',131)
  

/ * SQL错误(241):从字符串转换日期和/或时间时转换失败。 * /

     

/ * SQL错误(242):将varchar数据类型转换为日期时间数据类型会导致超出范围的值。 * /

除了一大堆带有SUBSTRING / CHARINDEX的笨蛋之外,还试图单独处理每个部分,但无济于事。

2 个答案:

答案 0 :(得分:0)

SELECT CONVERT(DATETIME, '2/05/2017 7:54:51 PM',131)
SELECT CONVERT(DATETIME, '2/05/2017 7:54:51 PM',22) -- wrong date time format

22输入格式错误 请参阅https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

答案 1 :(得分:0)

找到我的解决方案。由于误解“CONVERT”而导致错误

解决方案:

DECLARE @wrongdate DATETIME = CONVERT(VARCHAR, TRY_PARSE('2/05/2017 7:54:51 PM' AS DATETIME USING 'en-gb'), 121);
SELECT convert(bigint, datediff(ss,  '01-01-1970 00:00:00', @wrongdate));

如果您打算对select的结果进行操作,则需要对此进行操作,因此请将select更改为;

(CONVERT(bigint, datediff(ss,  '01-01-1970 00:00:00', CONVERT(VARCHAR, TRY_PARSE(CAST([MyColumn].Object AS VARCHAR) AS DATETIME USING 'en-gb'), 121)))) AS [my_column]