按日期选择并使用CONVERT

时间:2015-10-21 12:59:36

标签: asp.net sql-server

我正在创建一个asp.net页面(2.0),我的查询时间很糟糕。

我正在使用日期,使用convert(datetime,ExpirationDate)来格式化我的日期,这些日期存储在数据库中作为varchars,格式为'yyyymmdd'。

一切正常,直到我尝试用'n / a'替换空值,此时我得到:

Conversion failed when converting datetime from character string.

我试过

    case when expirationdate is not null then convert(datetime, expirationdate) 
else 'n/a' end as ExpirationDate

    case when expirationdate is null then 'n/a' 
else convert(datetime, expirationdate) end as ExpirationDate

我甚至尝试以编程方式更改单元格的值(在数据绑定gridview中),但没有运气。

我会采取任何解决方案。

我正在使用SQL Server 2005和VS Professional 2008。

我的完整查询是:

SELECT (firstname + ' ' + lastname) as userName, 
                EmployeeID, (SELECT Description FROM CMPRecords AS cm WHERE (CompentencyCode = co.CompetencyCode)) AS Competency, 
                convert(datetime, IssueDate) as IssueDate, 
                case when expirationdate is not null then CONVERT(datetime, expirationdate) else 'n/a' end as ExpirationDate FROM COMRecords AS co 
                WHERE (Username = @Username) 
                order by IssueDate Desc

1 个答案:

答案 0 :(得分:1)

问题在于,您试图说有时您需要datetime,有时您想要varchar。但你不能这样做。事实上,它发生的是它首先看到datetime值,并假设它应该转换失败的varchar。您应该只是转换它,如果是null,您将获得null datetime。或者使用varchar支票

将其保留为null
CONVERT(datetime, expirationdate) as ExpirationDate

ISNULL(expirationdate, 'n/a') as ExpirationDate

这实际上取决于你希望如何使用这个最有效的值。我建议您使用Convert,然后将值填充到DateTime?,然后在UI代码中进行格式化。

string toDisplay = ExpirationDate == null ? "n/a" : ExpirationDate.ToString("yyyy-MMM-dd")

当然,最好是更改数据库以将值正确存储为datetime而不是varchar