2014-10-09 57 views
0

我搜索并搜索了 - 找到了主题变体,但没有真正的答案给我的问题。将DateTIme转换为日期/“int is not allowed”错误

我需要将datetimeMAX转换为date,并将其插入到我创建的新表中。

这里是我的代码:

INSERT INTO [dbo].[OptOutEmails]([emailaddressid],[FirstOptOutDate], [LastOptOutDate], [bu_id], [brand_id]) 
SELECT [dbo].[DistinctEmailIds].[emailaddressid] as email 
,[dbo].[emailaddresses_summary].[bu_id] 
,[dbo].[emailaddresses_summary].[brand_id] 
, CONVERT(datetime, max([emailaddresses_summary].[FirstOptOutDate])) AS FirstOptOutDate 
, CONVERT(datetime, max([emailaddresses_summary].[LastOptOutDate])) AS LastOptOutDate 
FROM [dbo].[DistinctEmailIds] 
JOIN [dbo].[emailaddresses_summary] 
ON [dbo].[DistinctEmailIds].[emailaddressid] = [dbo].[emailaddresses_summary].[emailaddressid] 
WHERE [dbo].[emailaddresses_summary].[LastOptOutDate] IS NOT NULL 
GROUP BY [dbo].[DistinctEmailIds].[emailaddressid],[dbo].[emailaddresses_summary].[bu_id],[dbo].[emailaddresses_summary].[brand_id]; 
GO 

它需要进入这个表:

[emailaddressid] int not null PRIMARY KEY 
, [FirstOptOutDate] datetime null 
, [LastOptOutDate] datetime null 
, [bu_id] int null 
, [brand_id] int null 

错误消息我得到:消息257,级别16,状态3,第56行

不允许从数据类型datetime到int的隐式转换。使用CONVERT函数来运行此查询。

我试过了我能想到的一切。在我的代码中产生的CONVERT声明来自我认为可以解决此问题的字符串。没有任何工作。请帮忙?

回答

0

您收到错误信息,因为您的列顺序错误;在INSERT语句中的列不在select语句匹配顺序:

INSERT INTO [dbo].[OptOutEmails]([emailaddressid],[FirstOptOutDate], [LastOptOutDate], [bu_id], [brand_id]) 
SELECT [dbo].[DistinctEmailIds].[emailaddressid] as email 
,[dbo].[emailaddresses_summary].[bu_id] 
,[dbo].[emailaddresses_summary].[brand_id] 
, CONVERT(datetime, max([emailaddresses_summary].[FirstOptOutDate])) AS FirstOptOutDate 
, CONVERT(datetime, max([emailaddresses_summary].[LastOptOutDate])) AS LastOptOutDate 

你想这样的:

INSERT INTO [dbo].[OptOutEmails]([emailaddressid],[FirstOptOutDate], [LastOptOutDate], [bu_id], [brand_id]) 
SELECT [dbo].[DistinctEmailIds].[emailaddressid] as email 
, CONVERT(datetime, max([emailaddresses_summary].[FirstOptOutDate])) AS FirstOptOutDate 
, CONVERT(datetime, max([emailaddresses_summary].[LastOptOutDate])) AS LastOptOutDate 
, [dbo].[emailaddresses_summary].[bu_id] 
, [dbo].[emailaddresses_summary].[brand_id] 

此外,您可能要更改汇总列

, MAX(CONVERT(datetime, [emailaddresses_summary].[FirstOptOutDate])) AS FirstOptOutDate 
, MAX(CONVERT(datetime, [emailaddresses_summary].[LastOptOutDate])) AS LastOptOutDate 

因为这样可以更好地传达意图,并将MAX聚合函数应用于转换后的datetime列,而不是之前的任何操作(varchar可能?)。

+0

嗨,大家好 - 非常感谢你!大声笑 - 我后来添加了列,什么是noob(noobs任何人???)错误!除此之外,我还是遇到了Clustered Index错误(我的数据库在Azure中 - 这是另一个重要的信息)。但是我不想让emailaddressid成为PK,所以我使用表中的AUTO_INCREMENT代码创建了ID ...'CREATE TABLE OptOutEmails ( ID INT IDENTITY(1,1)PRIMARY KEY ,[emailaddressid]诠释不为空 ,[FirstOptOutDate]日期时间空 ,[LastOptOutDate]日期时间空 ,[bu_id] INT空 ,[brand_id] int null ); GO'然后,它就像一个魅力!谢谢! – FirstLoser 2014-10-09 12:22:46

0

第四列bu_id是int类型

转换做转换为datetime的,所以你得到的错误

, CONVERT(datetime, max([emailaddresses_summary]) 

你可以把它转换成整型,因为这将返回天数1900年1月1日 或者你需要定义列的日期时间

与brand_id柱相同的问题

, CONVERT(int, max([emailaddresses_summary])