将 varchar(14) 转换为 datetime 会导致异常
convert a varchar(14) to a datetime cause a exception
我有一个数据库,里面有我的病人。患者有进入和退出日期 是字符串。
例如:20130510183900 (10-05-2013 18:39)
首先是数据库中的那个,然后是我需要的值
我想将其转换为日期时间,以便与其他日期进行比较。
我也无法在视图中显示它的转换
我已经尝试先将其转换为 varchar 或 int,但没有成功
convert(datetime, enterDate, 121) -- does not work
convert(datetime, enterDate, 121) AS enterDate -- does not work
我得到的错误是:
Conversion failed when converting date and/or time from character
string.
将日期时间值存储为字符串是错误的。话虽如此,你可以使用DATETIMEFROMPARTS
函数:
SELECT DATETIMEFROMPARTS(
SUBSTRING(enterDate, 1, 4),
SUBSTRING(enterDate, 5, 2),
SUBSTRING(enterDate, 7, 2),
SUBSTRING(enterDate, 9, 2),
SUBSTRING(enterDate, 11, 2),
SUBSTRING(enterDate, 13, 2),
0
)
FROM (SELECT '20130510183900') AS v(enterDate)
同样,将日期时间值存储为字符串是错误的。
另一种选择是使用 stuff
和 convert
的组合:
DECLARE @DateString varchar(14) = 20130510183900
SELECT CONVERT(DateTime,
STUFF(
STUFF(
STUFF(
STUFF(
STUFF(@DateString, 13, 0, ':')
, 11, 0, ':')
, 9, 0, 'T')
, 7, 0, '-')
, 5, 0, '-'),
126)
stuff
函数将字符串转换为 2013-05-10T18:39:00
并且带有 126 样式的 convert
将其更改为 DateTime
值。
但我同意 Salman 的观点——将日期时间值存储为字符串是错误的。
试试这个:
DECLARE @DateString varchar(14) = '20130510183900'
-- desired format: '20130510 18:39:00'
SET @DateString = STUFF(STUFF(STUFF(@DateString,13,0,':'),11,0,':'),9,0,' ')
SELECT CONVERT(datetime, @DateString)
-- Output: 2013-05-10 18:39:00.000
您的问题是输入字符串,sql 不调整字符串就无法解决这个问题。顺便说一句:Convert() 的第三个参数用于 cast/format 日期时间到字符串:
SELECT CONVERT(VARCHAR, CONVERT(datetime, @DateString), 101)
-- Output: 05/10/2013
select中的用法:
SELECT CONVERT(datetime, STUFF(STUFF(STUFF(<DateTimeStringColumn>,13,0,':'),11,0,':'),9,0,' ')) AS DateTimeValue
FROM ...
我有一个数据库,里面有我的病人。患者有进入和退出日期 是字符串。
例如:20130510183900 (10-05-2013 18:39)
首先是数据库中的那个,然后是我需要的值
我想将其转换为日期时间,以便与其他日期进行比较。
我也无法在视图中显示它的转换
我已经尝试先将其转换为 varchar 或 int,但没有成功
convert(datetime, enterDate, 121) -- does not work
convert(datetime, enterDate, 121) AS enterDate -- does not work
我得到的错误是:
Conversion failed when converting date and/or time from character string.
将日期时间值存储为字符串是错误的。话虽如此,你可以使用DATETIMEFROMPARTS
函数:
SELECT DATETIMEFROMPARTS(
SUBSTRING(enterDate, 1, 4),
SUBSTRING(enterDate, 5, 2),
SUBSTRING(enterDate, 7, 2),
SUBSTRING(enterDate, 9, 2),
SUBSTRING(enterDate, 11, 2),
SUBSTRING(enterDate, 13, 2),
0
)
FROM (SELECT '20130510183900') AS v(enterDate)
同样,将日期时间值存储为字符串是错误的。
另一种选择是使用 stuff
和 convert
的组合:
DECLARE @DateString varchar(14) = 20130510183900
SELECT CONVERT(DateTime,
STUFF(
STUFF(
STUFF(
STUFF(
STUFF(@DateString, 13, 0, ':')
, 11, 0, ':')
, 9, 0, 'T')
, 7, 0, '-')
, 5, 0, '-'),
126)
stuff
函数将字符串转换为 2013-05-10T18:39:00
并且带有 126 样式的 convert
将其更改为 DateTime
值。
但我同意 Salman 的观点——将日期时间值存储为字符串是错误的。
试试这个:
DECLARE @DateString varchar(14) = '20130510183900'
-- desired format: '20130510 18:39:00'
SET @DateString = STUFF(STUFF(STUFF(@DateString,13,0,':'),11,0,':'),9,0,' ')
SELECT CONVERT(datetime, @DateString)
-- Output: 2013-05-10 18:39:00.000
您的问题是输入字符串,sql 不调整字符串就无法解决这个问题。顺便说一句:Convert() 的第三个参数用于 cast/format 日期时间到字符串:
SELECT CONVERT(VARCHAR, CONVERT(datetime, @DateString), 101)
-- Output: 05/10/2013
select中的用法:
SELECT CONVERT(datetime, STUFF(STUFF(STUFF(<DateTimeStringColumn>,13,0,':'),11,0,':'),9,0,' ')) AS DateTimeValue
FROM ...