Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将月/年SQL转换为正确的格式_C#_.net_Sql - Fatal编程技术网

C# 将月/年SQL转换为正确的格式

C# 将月/年SQL转换为正确的格式,c#,.net,sql,C#,.net,Sql,我有一个文本字段,用户使用修改后的jquery日期选择器输入日期。文本字段具有月份和年份,如“2011年7月” 我需要在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

我有一个文本字段,用户使用修改后的jquery日期选择器输入日期。文本字段具有月份和年份,如“2011年7月”

我需要在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值,但我知道我有一个记录作为测试。为什么不算呢

我的程序:

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

首先,必须将字符串表示形式转换为服务器上的有效DateTime结构对象。您可以使用
var-date=DateTime.ParseExact(“2011年7月1日”,“MM-dd-yyyy”,CultureInfo.CurrentUICulture)
DateTime.TryParse
。然后将其作为参数传递到SqlCommand中。查询时不要使用字符串,尤其是来自用户输入的字符串。

将varchar转换为所需的适当格式,然后进行比较 检查格式列表。希望这能帮上忙

如果不需要中间值,可以使用

未经测试的示例:

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

确切的语法取决于SQL引擎,但如果从每月的1号开始,那么加上1个月,最后减去1天;你得到了月底

(我假设MS SQL Server与您的C#标记匹配)


或者仅仅是
YEAR(SignupDate)
MONTH(SignupDate)
Austin的方法更好,因为它避免了分钟造成的混乱。在TCC的例子中,整个7月31日被忽略,因为它的时间是'00:00:00',这看起来好像对我有效。添加了一些代码。检查我的编辑。你的编辑与问题的标题并不相关,我通常会推荐一个新问题,而不是编辑。(例如,包括架构详细信息、有关ValidCount和InvalidCount是否可为空的信息等。您可能需要SUM(COALESCE())而不是COALESCE(SUM()),您可能需要外部联接,目前没有足够的信息回答您的编辑。)
SELECT
  *
FROM
  members
WHERE
  signupdate BETWEEN @param AND DATEADD(MONTH, 1, @param) - 1