在SQL server中从nvarchar转换为datetime
我将字段数据datetime存储在varchar类型中。 我试图将它们转换为datetime,但失败了在SQL server中从nvarchar转换为datetime,sql,sql-server,Sql,Sql Server,我将字段数据datetime存储在varchar类型中。 我试图将它们转换为datetime,但失败了 declare @mydate nvarchar(50) = '23-JUL-18 10.47.03.003000 AM' select convert(datetime,@mydate,103) 没有与您的日期格式匹配的样式代码。对于理货表,以下结果不返回: DECLARE @mydate nvarchar(50) = '23-JUL-18 10.47.03.003000 AM'; W
declare @mydate nvarchar(50) = '23-JUL-18 10.47.03.003000 AM'
select convert(datetime,@mydate,103)
没有与您的日期格式匹配的样式代码。对于理货表,以下结果不返回:
DECLARE @mydate nvarchar(50) = '23-JUL-18 10.47.03.003000 AM';
WITH
test AS
(SELECT TOP 500
TRY_CONVERT(datetime, @mydate, v.N) AS Conv,
N
FROM dbo.vTally v)
SELECT *
FROM test
WHERE test.Conv IS NOT NULL;
如果格式为始终dd-mon-yy hh.mi.ss.mmmmmm-am
这应该可以:
SELECT CONVERT(datetime2(6),SUBSTRING(@MyDate,4,3) + N' ' + LEFT(@MyDate,2) + N' 20' + SUBSTRING(@MyDate,8,2) + N' ' + REPLACE(SUBSTRING(@MyDate,11,8),N'.',N':') + REPLACE(RIGHT(@MyDate,10),N' ',N''),109)
没有与您的日期格式匹配的样式代码。对于理货表,以下结果不返回:
DECLARE @mydate nvarchar(50) = '23-JUL-18 10.47.03.003000 AM';
WITH
test AS
(SELECT TOP 500
TRY_CONVERT(datetime, @mydate, v.N) AS Conv,
N
FROM dbo.vTally v)
SELECT *
FROM test
WHERE test.Conv IS NOT NULL;
如果格式为始终dd-mon-yy hh.mi.ss.mmmmmm-am
这应该可以:
SELECT CONVERT(datetime2(6),SUBSTRING(@MyDate,4,3) + N' ' + LEFT(@MyDate,2) + N' 20' + SUBSTRING(@MyDate,8,2) + N' ' + REPLACE(SUBSTRING(@MyDate,11,8),N'.',N':') + REPLACE(RIGHT(@MyDate,10),N' ',N''),109)
结合左侧和替换,您的尝试几乎达到了-
DECLARE @mydate nvarchar(50) = '23-JUL-18 10.47.03.003000 AM'
SELECT LEFT(REPLACE(@mydate, '.', ':'), 18)
SELECT TRY_CONVERT(DATETIME,LEFT(REPLACE(@mydate, '.', ':'), 18),103)
结合左侧和替换,您的尝试几乎达到了-
DECLARE @mydate nvarchar(50) = '23-JUL-18 10.47.03.003000 AM'
SELECT LEFT(REPLACE(@mydate, '.', ':'), 18)
SELECT TRY_CONVERT(DATETIME,LEFT(REPLACE(@mydate, '.', ':'), 18),103)
下面是一个相当干净的方法,使用
TRY\u CONVERT
:
SELECT
TRY_CONVERT(DATETIME, LEFT(@mydate, 9)) +
TRY_CONVERT(DATETIME, REPLACE(RIGHT(STUFF(@mydate, 19, 7, ''), 11), '.', ':')) AS dt;
但是使用这样的查询是不可能的,至少如果您必须每天查看这段代码的话。相反,您可以尝试将传入的数据转换为SQL Server可以直接使用的格式。这里有一个相当干净的方法,使用
try\u CONVERT
:
SELECT
TRY_CONVERT(DATETIME, LEFT(@mydate, 9)) +
TRY_CONVERT(DATETIME, REPLACE(RIGHT(STUFF(@mydate, 19, 7, ''), 11), '.', ':')) AS dt;
但是使用这样的查询是不可能的,至少如果您必须每天查看这段代码的话。相反,您可以尝试看看是否可以将传入的数据转换为SQL Server可以直接使用的格式。在有人提供更好的方法之前,这似乎是可行的 我绝对建议您在接受此解决方案之前等待更好的解决方案
DECLARE @mydate NVARCHAR(50) = '23-JUL-18 10.47.03.003000 AM'
,@changing NVARCHAR(50)
SET @changing = STUFF(@mydate, CHARINDEX('.', @mydate), 1, ':')
SET @changing = STUFF(@changing, CHARINDEX('.', @changing), 1, ':')
SELECT CAST(CAST(@changing AS DATETIME2) AS DATETIME)
除非有人能提供更好的方法,否则这似乎是可行的 我绝对建议您在接受此解决方案之前等待更好的解决方案
DECLARE @mydate NVARCHAR(50) = '23-JUL-18 10.47.03.003000 AM'
,@changing NVARCHAR(50)
SET @changing = STUFF(@mydate, CHARINDEX('.', @mydate), 1, ':')
SET @changing = STUFF(@changing, CHARINDEX('.', @changing), 1, ':')
SELECT CAST(CAST(@changing AS DATETIME2) AS DATETIME)
按照“103”是“DD/MM/YYYY”格式,因此这与您的字符串不匹配。事实上,我认为任何预设格式都不会匹配这个特定字符串。我最好首先不要将日期存储为文本。这类似于VMS日期。请在此提供您所需的格式作为示例。@AbdurRahman OP希望将其转换为datetime对象,而不是特定的格式,因为“103”是“DD/MM/YYYY”格式,所以这与您的字符串不匹配。事实上,我认为任何预设格式都不会匹配这个特定字符串。我最好首先不要将日期存储为文本。这类似于VMS日期。请在此提供您所需的格式作为示例。@AbdurRahman OP希望将其转换为datetime对象,而不是浪费时间的特定格式。这会浪费时间。比我的尝试更干净。:)@Larnu I以前也明确地使用了
CONVERT
,这是一种老派的方法,但不断被使用TRYCONVERT
的答案击败。所以,我要“接受这个节目”,非常感谢!我做得比我的尝试干净得多。:)@Larnu I以前也明确地使用了CONVERT
,这是一种老派的方法,但不断被使用TRYCONVERT
的答案击败。所以,我要“接受这个节目”,非常感谢!我做到了