2014-10-07 60 views
0

我有一个数据库设置为奇怪的错误使用CONVERT功能

Account (accountNo, ownerNo, balance) 
Owner (ownerNo, firstName, lastName) 
Event (id, accountNo, event, amount, eventDate) 

所以我想这样做可以列出帐户1所有交易(事件表)为月;

CREATE VIEW FourA AS 
    SELECT 
     id, accountNo, event, amount, 
     CONVERT(varchar, eventDate, 103) AS eventDate 
    FROM 
     Event 
    WHERE 
     accountNo = 1 AND eventDate >= '01/07/2014' AND eventDate < '31/07/2014' 

我第一次跑这个,它跑得很完美。现在,我得到一个错误的CONVERT功能:

消息242,级别16,状态3,第1行
varchar数据类型为datetime数据类型的转换导致的失范围值。

然而!当我运行:

select 
    CONVERT(varchar, eventDate, 103) AS eventDate 
from 
    Event 

它给出了完美的结果:

eventDate 
01/01/2014 
07/11/2014 
08/01/2014 
01/01/2014 
07/10/2014 
08/02/2014 

所以很明显这是没有错的。但是,为什么我不断得到这个奇怪的错误?有人知道吗?

注:这是SQL Server

+2

边注时:你应该为你的列使用适当的数据类型。在'Varchar'中存储'DateTime'值会反复咬你。不要解决这个问题。修复表格。 – 2014-10-07 04:04:00

+0

同意。创可贴不会持续很长时间。 – ps2goat 2014-10-07 04:06:29

+0

@MikeW我实际上确实将它存储为DateTime值,但问题是以很好的格式显示它。因为它显示为2014-01-01 00:00:00.000除非有办法将它存储为MM/DD/YYYY – user2961971 2014-10-07 04:09:29

回答

1

的问题是不是你的CONVERT函数中。问题在于WHERE子句中日期文字的隐式转换。我建议你使用的日期文字的YYYYMMDD格式:

CREATE VIEW FourA AS 
SELECT id, accountNo, event, amount, CONVERT(varchar(10), eventDate, 103) AS eventDate 
FROM Event 
WHERE accountNo = 1 AND eventDate >= '20140701' AND eventDate < '20140731' 

如下评论说,如果你不想在结果字符串中使用时间部分VARCHAR(10)转换日期

+0

由于转换会导致长度为10的VARCHAR,因此最好使用CONVERT(VARCHAR(10),eventDate,103)。 – 2014-10-07 04:12:34

+0

这很奇怪。它不会返回任何行。 Arg ... – user2961971 2014-10-07 04:13:19

+0

只有你知道你的桌子上有什么......我只能猜测 – cha 2014-10-07 04:14:23