Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL server中从nvarchar转换为datetime_Sql_Sql Server - Fatal编程技术网

在SQL server中从nvarchar转换为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

我将字段数据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';
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
的答案击败。所以,我要“接受这个节目”,非常感谢!我做到了