我正在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'是数据库中我的日期字段的名称。最大的问题是我不知道如何比较我使用过的格式的年份和月份。
答案 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注入攻击。相反,你应该使用参数。