2016-01-13 102 views
0

我正在使用C#,尝试按月排序数据。我有一个日期列StartDate和查询如下:字符串到日期时间错误

SELECT 
    CompanyKey, CompanyName, CAST(Month(StartDate) as varchar(2)) + '/' + 
    CAST(YEAR(StartDate) as varchar(4)) as StartDate, SUM(Visits) 

    FROM ProfileStats    
    WHERE StartDate between '2012/12/28' and '2015/12/29' 
    GROUP BY CompanyKey, CompanyName, StartDate, Visits 

但是,如果使用一个月(StartDate)或CAST语法,它抛出一个异常:

Additional information: Object of type 'System.String' cannot be converted 
to type 'System.DateTime'. 

任何帮助/线索将不胜感激。

+0

您的日期时间转换为varchar在SQL,为什么呢? – Seano666

+0

你想要什么日期显示?是MM/yyyy吗? – abramlimpin

+0

如果你真的想这样做,你错过了日期的一部分......但是你不必像C#自动执行日期或日期时间列。 –

回答

1

StartDate是一个DateTime列,您试图将其创建为一个字符串。您需要创建一个DateTime对象,可能如Create a date with T-SQL中所示,尽管不知道您使用的是哪种SQL变体,但很难回答。

如果你按月试图组我柯克布罗德赫斯特的答案达成一致,通过使组,利用一个月修改:

SELECT CompanyKey, CompanyName, StartDate, SUM(Visits) 
FROM ProfileStats  
WHERE StartDate between '2012/12/28' and '2015/12/29' 
GROUP BY CompanyKey, CompanyName, YEAR(StartDate), MONTH(StartDate), Visits 

,只是如果你想按月排序你需要一个排序词组,不是吗?例如:

SELECT CompanyKey, CompanyName, YEAR(StartDate) + '-' + MONTH(StartDate) AS StartDate_YearMonth, SUM(Visits) 
FROM ProfileStats  
WHERE StartDate between '2012/12/28' and '2015/12/29' 
GROUP BY CompanyKey, CompanyName, YEAR(StartDate) + '-' + MONTH(StartDate), Visits 
ORDER BY CompanyKey, CompanyName, YEAR(StartDate) + '-' + MONTH(StartDate), Visits 

除非您想按其他属性进行分组并按月分类而不使用这些组。你有点模糊

+0

感谢编辑Alex。这对我来说很懒。 – christutty

0

你的C#代码试图将你返回的字符串(VARCHAR)转换为DateTime对象。如果格式正确,它可以这样做,但是这种格式不正确 - 仅仅是月份和年份。请选择StartDate

SELECT CompanyKey, CompanyName, StartDate, SUM(Visits)  
FROM ProfileStats   
WHERE StartDate between '2012/12/28' and '2015/12/29' 
GROUP BY CompanyKey, CompanyName, StartDate, Visits 

它将被装入一个C#DateTime对象,然后你可以使用.Month属性做任何分组或过滤。

如果您想选择开始在每个月的开始部分合成日期,允许分组,我能想到的两个SQL选择:

  • 选择日期与01每天值,例如

    CAST(YEAR(StartDate) as varchar(4)) + '-' + CAST(Month(StartDate) as varchar(2)) + '-01' + as StartDate

  • 减去从SQL日期目前的 '天';例如1/13减去(13-1)得到1/1;为1/15减去(15-14)得到1/1。

    StartDate - (DAY(StartDate) - 1)


不过,如果你需要做你的应用程序分组和过滤,我可能更喜欢带回整个日期和执行应用程序中的过滤。

+0

谢谢柯克,但我已经尝试过这种解决方案,我试图通过使用月(StartDate)和年(StartDate)作为月/月提取数据“月” 使用StartDate将根据DD/MM/YYYY。 – ashhad

+0

您无法创建仅有月份和年份的日期。你可以创建一个类似于'YYYY-MM-01'的字符串,C#应该始终接受这个字符串(注意,年份 - 月 - 日是日期的最佳字符串表示,因为它在文化上是明确的)。然而,从一个日期到一个字符串,并不是理想的模式,我会亲自避免它。 –

+0

非常感谢Kirk,我得到了你的解释。它讲得很有道理。我只是想办法实现这一点。也许可以通过使用多个if/else或使用Linq来实现。 – ashhad

0

假设你正在努力实现mm/yyyy格式为您STARTDATE 你可以使用这样的事情

SELECT 
CompanyKey, CompanyName, , SUM(Visits) ,right( CONVERT(VARCHAR(10),startdate,103),7) as startdate ,SUM(Visits) 

FROM ProfileStats    
WHERE StartDate between '2012/12/28' and '2015/12/29' 
GROUP BY CompanyKey, CompanyName, StartDate, Visits