转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV
Posted
技术标签:
【中文标题】转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV【英文标题】:Conversion failed when converting date and/or time from character string when converting inputted time | SQL, SQLSRV 【发布时间】:2019-08-12 06:38:31 【问题描述】:我对这个查询有疑问。我收到以下错误。
我正在尝试将 10:00 PM 转换为 22:00,基本上从 12 小时格式转换为 24 小时格式。
消息 241,第 16 级,状态 1,第 2 行 从字符串转换日期和/或时间时转换失败。
schedulename 列的值为
10:00 PM - 06:00 AM
10:00 PM - 06:00 AM
还有一行叫做REST
我将它设置为LEFT(schedulename,8)
,这样我就可以得到左边的时间表,然后RIGHT(schedulename,8)
,这样我就可以得到右边的时间表。
我正在使用 SQLSRV、SQLSERVER 2012 和 XAMPP。
SELECT
Format(cast(LEFT(schedulename,8) as datetime),'HH:mm:ss') AS login,
Format(cast(RIGHT(schedulename,8) as datetime),'HH:mm:ss') AS logout
FROM
employeesschedulelist
WHERE
employeeidno='D0150000005'
我也试过这个,但没有运气。
SELECT
CONVERT(VARCHAR, LEFT(schedulename,8), 108) as login,
CONVERT(VARCHAR, RIGHT(schedulename,8), 108) as logout
from employeesschedulelist
where employeeidno='D0150000005'
在不改变我的专栏的情况下,还有其他解决方案吗?
【问题讨论】:
我无法重现 sqlfiddle.com/#!18/9eecb/53812 - 也许列中的值不是您期望的值? @Qirel,我不明白,为什么它在 sqlfiddle 中可以完美运行?会不会是我使用的是 SQL SERVER 2012? 我猜测您的列不完全是10:00 PM - 06:00 AM
,可能其中有一些空格或其他字符。
你确定 len(schedulename) = 19 吗? (我想像@Qirel 应该有更多的空格,可能是前导、尾随或在字符串的中间)
使用try_cast
。此函数为无效转换返回 null
,它在 SQL Server 2012 中可用。
【参考方案1】:
您可以使用TRY_CAST()
代替CAST()
。如果转换失败,它将返回NULL
。
SELECT FORMAT(TRY_CAST(LEFT(schedulename ,8) AS DATETIME),'HH:mm:ss') AS login,
FORMAT(TRY_CAST(RIGHT(schedulename, 8) AS DATETIME),'HH:mm:ss') AS logout
FROM employeesschedulelist
WHERE employeeidno = 'D0150000005'
TRY_CAST()
documentation
Live SQL fiddle
【讨论】:
【参考方案2】:试试这个。
SELECT
CONVERT(TIME,(LEFT(schedulename,8))) AS login,
CONVERT(TIME,(RIGHT(schedulename,8))) AS logout
FROM employeesschedulelist
WHERE employeeidno='D0150000005'
【讨论】:
我看到了导致问题的原因,名为 REST 的列中的值,有没有办法让我们以某种方式绕过它并继续查询?以上是关于转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV的主要内容,如果未能解决你的问题,请参考以下文章