2017-03-08 50 views
0

我在c#.net中制作项目,我在数据库查询中遇到困难。比较一个月和一年的sql数据库

我在我的数据库表中,我已存储的日期数据类型varchar(50)并通过(convert(varchar(8),getdate(),5)为默认所以它给了我在dd-MM-YY e.g 28-03-17日期的日期列。

现在,用户输入一个月格式MM和文本框年格式YY“只(没有出头之日),并在情况下,如果用户输入(month,year)等于数据库表中的月和年然后显示的所有数据。

我知道我必须先提取月份和年份从表日期,然后与用户输入进行比较,从寻找我才知道,通过使用Year(DateField)我可以从日期字段提取年份和月份Month(Date Field)

我使用以下查询却根本不对。

"select * from table1 
where YEAR(Time=convert(varchar(8),getdate(),5))='" + textBox1.Text + 
"' AND MONTH(Time=convert(varchar(8),getdate(),5))='" + textBox2.Text + "'"; 

其中'时间'是我在数据库中的日期字段的名称。最大的问题是我不知道如何比较使用此格式的年份和月份。

+0

我使用这个查询得到了很多错误。 –

+1

与问题无关,但不是在评论中添加信息,而是可以编辑您的问题。 – TheLethalCoder

+1

getDate是sql-server函数...不是mysql ..请确认您的db标记.. – scaisEdge

回答

0

假设(如你所提到的)在VARCHAR列中的日期存储为dd-MM-YY那么这个查询应该工作:

SELECT * FROM TABLE 
WHERE SUBSTRING(-DateColumn-,4,2) = textBox1.text 
AND SUBSTRING(-DateColumn-,7,2) = textBox2.text 

因为要存储的日期作为文本,没有必要的东西转换。你应该能够做一个字符串比较。

0

首先,sql服务器有一个日期时间数据类型,所以你不应该在数据库中存储日期作为一个字符串。

如果你没有做到这一点,你会做这样的事情:

select * from table1 
where YEAR(Time)=" + textBox1.Text + 
" AND MONTH(Time)=" + textBox2.Text; 

年和时间都返回整数,所以你不需要分隔从您的文本框文本用单引号。

还有一件事,以前的评论是正确的,你不应该直接从文本框中的文本,并将其注入到一个SQL字符串。它会打开你的SQL注入攻击。相反,你应该使用参数。

1

您需要将Time列的值转换为DateTime并将YEAR取出。 您将得到四位数的年份值,例如2017.要将其转换为两位数,您需要使用模运算符将其除以100。

//Preparing parameterized query to avoid SQL injection. 
var sqlQuery = "select * from Tokens where (YEAR(Convert(datetime,Time,5)) % 100) = @year AND MONTH(Convert(datetime,Time,5)) = @month"; 

//Preparing command and adding parameters with the values. 
var sqlCommand = new SqlCommand(); 
sqlCommand.CommandText = sqlQuery; 
sqlCommand.Parameters.Add("@year", textBox1.Text); 
sqlCommand.Parameters.Add("@month", textBox2.Text); 

现在您可以使用此命令从数据库检索数据。

+0

非常感谢@Chetan Ranpariya它工作得非常好!也给所有给予他们建议的人:) –