比较一个月和年的SQL数据库

时间:2017-03-08 17:01:03

标签: c# sql-server date

我正在c#.net中创建项目,我在数据库查询中陷入困境。

我的数据库表中有一个日期列,我在其中存储了数据类型为varchar(50)的日期,并将(convert(varchar(8),getdate(),5)作为默认值传递,因此它在dd-MM-YY中给出了一个日期,例如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 + "'";

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

3 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

假设VARCHAR列中的日期存储为dd-MM-YY(如您所述),则此查询应该有效:

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

由于您将日期存储为文本,因此无需转换任何内容。你应该能够进行字符串比较。

答案 2 :(得分:0)

首先,sql server具有日期时间数据类型,因此您不应将数据库中的日期存储为字符串。

如果你这样做,你会做类似的事情:

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

年份和时间都返回整数,因此您无需使用单引号分隔文本框中的文本。

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