将DateTIme转换为Date /"不允许使用int"错误

时间:2014-10-09 01:29:23

标签: sql datetime

我进行了搜索和搜索 - 找到了主题的变体,但对我的问题没有真正的答案。

我需要将MAX的{​​{1}}转换为datetime,并将其插入我创建的新表中。

这是我的代码:

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

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

  

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

我已经尝试了我能想到的一切。我的代码中生成的[emailaddressid] int not null PRIMARY KEY , [FirstOptOutDate] datetime null , [LastOptOutDate] datetime null , [bu_id] int null , [brand_id] int null 语句来自我认为可以解决此问题的字符串。什么都行不通。请帮帮忙?

2 个答案:

答案 0 :(得分:3)

您收到错误是因为您的列顺序错误; 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可能是?)。

答案 1 :(得分:0)

第四列bu_id的类型为int

转换正在转换为datetime,因此您收到错误

 , CONVERT(datetime,    max([emailaddresses_summary])

您可以将其转换为int,这将返回自1900年1月1日以来的天数 或者您需要将列定义为日期时间

与brand_id专栏相同的问题

, CONVERT(int, max([emailaddresses_summary])