SQL Query在加入时将nvarchar转换为datetime

时间:2015-12-17 18:39:24

标签: sql-server sql-server-2008 datetime join

我有两个包含事件类型信息的表。一个正确设置日期和时间戳,即使用datetime,另一个有nvarchar。 我无法更改列定义。

我想在带有两个时间戳列的查询中加入这些表。

我这里有一个小提琴:http://sqlfiddle.com/#!3/c7e1be

我认为这样可行:

select 
  Event1.Col1, Event1.EventDateTime1, 
  Event2.Col2, convert(datetime,Event1.EventDateTime1,121) as EventDateTime21

from Event1 FULL OUTER JOIN EVENT2 
  on Event1.EventDateTime1 = EventDateTime21

但是我对sql的基本知识让我失望了!

如何让我的专栏EventDateTime21存在?

任何帮助都会很棒。

谢谢,

明镜

2 个答案:

答案 0 :(得分:0)

这假定所有字符串都是有效日期:

from A inner join B on cast(B.date_column as datetime) = A.date_column

根据你的小提琴,一个可能的对应关系是:

select *
from Event1 e1 inner join Event2 e2
    on e2.Col2 = stuff(e1.Col1, 4, 0, 'X')

使用时间戳的另一种可能性:

with e1 as (
    select *, row_number() over (order by EventDateTime1) as rn
), e2 as (
    select *, row_number() over (order by EventDateTime2) as rn
)
select *
from e1 inner join e2
    on e2.rn = e1.rn

编辑:更新问题并对接受的答案发表评论后:

我认为你真的想要一个工会。它将比具有两个永不匹配的列的连接和连接条件中的强制转换快得多。

select Col1 as Col, EventDateTime1 as EventDateTime from Event1
union all
select Col2, convert(datetime, EventDateTime2, 121) from Event2

答案 1 :(得分:0)

您应该使用CONVERT,这样您就可以使用正确的数据格式(在这种情况下,它将是121):

SELECT *
FROM dbo.Event1 E1
INNER JOIN dbo.Event2 E2
    ON E1.EventDateTime1 = CONVERT(DATETIME,E2.EventDateTime2,121);

无论如何,日期不匹配,因此查询结果为零