C# 比较月和年sql数据库

C# 比较月和年sql数据库,c#,sql-server,date,C#,Sql Server,Date,我正在c#net上做一个项目,在那里我陷入了数据库查询的困境 我在数据库的表中有一个日期列,我在其中存储了数据类型为varchar(50)的日期,并将(convert(varchar(8),getdate(),5)作为默认值传递给我,因此它给我一个dd-MM-YY的日期,例如28-03-17 现在,用户只在文本框中输入月格式MM和年格式YY(而不是天),如果用户输入的(月、年)等于数据库表的月和年,则显示所有数据 我知道我必须首先从表日期提取月份和年份,然后与用户输入进行比较。通过搜索,我知道通

我正在c#net上做一个项目,在那里我陷入了数据库查询的困境

我在数据库的表中有一个日期列,我在其中存储了数据类型为
varchar(50)
的日期,并将
(convert(varchar(8),getdate(),5)
作为默认值传递给我,因此它给我一个
dd-MM-YY
的日期,例如
28-03-17

现在,用户只在文本框中输入月格式
MM
和年格式
YY
(而不是天),如果用户输入的
(月、年)
等于数据库表的月和年,则显示所有数据

我知道我必须首先从表日期提取月份和年份,然后与用户输入进行比较。通过搜索,我知道通过使用
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”是数据库中日期字段的名称。最大的问题是我不知道如何以我使用的格式比较年份和月份。

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

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

由于您将日期存储为文本,因此无需转换任何内容。您只需进行字符串比较即可。

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

如果你这样做了,你会这样做:

select * from table1 
 where YEAR(Time)=" + textBox1.Text + 
 " AND MONTH(Time)=" + textBox2.Text;
年份和时间都返回整数,因此您不需要用单个引号分隔文本框中的文本


还有一件事,前面的评论者是对的,你不应该直接从文本框中提取文本并将其注入sql字符串。这会让你遭受sql注入攻击。相反,你应该使用参数。

你需要将
Time
列的值转换为DateTime,并从中获取年份。 您将获得四位数的年份值,如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);

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

我使用此查询时遇到许多错误。与问题无关,但您可以在注释中添加信息来回答问题。getDate是sql server函数…不是mysql..请确认您的db标记..您可以这样做:按您所说的格式(dd)添加天数,并将其与数据库中的记录进行比较。我的意思是将01添加到字符串的开头,这样无论数据库中的日期是哪一天,您的日期都将等于或小于该日期。而且,通过将文本框的文本值直接传递到sql语句中,您会有一个巨大的sql注入漏洞…到您的act中就这点而言,您存储的文本格式是什么?您是否可以将存储的数据类型改为
date
,而不是
varchar(50)
,或者这是固定不变的?非常感谢@Chetan Ranpariya,它工作得非常好!。也感谢所有提出建议的人:)