2011-07-26 47 views
0

我有一个textfield,用户使用修改后的jquery datepicker输入日期。该文本字段具有“2011年7月”月/年SQL以正确的格式

我需要在2011年7月1日和2011年7月31日之间运行查询来搜索结果。我在数据库中的日期是smalldatetime,所以我需要我的查询看起来像这样:

select * from members where signupdate between 'july 1 2011' and 'july 31 2011' 

如何,我可以得到2011年7月的用户输入的日期转换为“2011年7月1日”和“2011年7月31日”?

编辑

我只获得了从InvalidCount一个0值,但我知道我有一个记录在那里进行测试。为什么不算呢?

MY PROC:

SELECT 
(SELECT COUNT(*) FROM dbo.Members m WHERE m.memberID = @pMemberID AND m.SignUpDate BETWEEN @pDate AND DATEADD(MONTH, 1, @pDate)-1) AS 'SignUpDate', 
COALESCE(SUM(m.ValidCount), 0) AS ValidCount, 
COALESCE(SUM(m.InvalidCount), 0) AS InvalidCount 

FROM 
dbo.Members m 

INNER JOIN 
dbo.MemberStats ms ON m.MemberID = ms.MemberID 

WHERE 
m.SignUpdate BETWEEN @pDate AND DATEADD(MONTH, 1, @pDate)-1 

回答

1

确切的语法依赖于SQL引擎,但如果你开始与本月1日起,再加入1个月,终于减去1天;你会得到月底。

(我假设MS SQL服务器到您的C#代码匹配)

SELECT 
    * 
FROM 
    members 
WHERE 
    signupdate BETWEEN @param AND DATEADD(MONTH, 1, @param) - 1 
+0

这看起来好像在为我工作。虽然增加了一些代码。检查我的编辑。 –

+0

你的编辑与问题的标题并不真正相关,我通常会推荐一个新问题,而不是编辑。 (例如;包含模式细节,关于ValidCount和InvalidCount是否为空的信息等等。您可能需要SUM(COALESCE())而不是COALESCE(SUM())),您可能需要一个OUTER JOIN,目前没有足够的信息来回答你的编辑。) – MatBailie

0

首先,您必须将字符串表示形式转换到服务器上的一个有效的DateTime结构对象。您可以使用var date = DateTime.ParseExact("july 1 2011", "MMMM dd yyyy", CultureInfo.CurrentUICulture)DateTime.TryParse。然后你将它作为参数传递给你的SqlCommand。查询时切勿使用字符串,特别是在用户输入时。

0

将varchar转换为您想要的适当格式,然后比较 检查格式列表。希望这有助于兄弟。

convert date

1

如果之间不需要,您可以使用DatePart

未经测试的例子:

where DATEPART(yyyy, SignupDate) = 2011 and DATEPART(m, SignupDate) = 7 
+1

或者只是'YEAR(SignupDate)'和'MONTH(SignupDate)' –

+0

奥斯汀的做法是更好,因为它避免造成的混乱以分钟计。在TCC的例子中,整个7月31日被忽略,因为它的时间是'00:00:00' –