【问题标题】:Comparing a month and year sql database比较一个月和一年的sql数据库
【发布时间】:2017-03-08 17:01:02
【问题描述】:

我正在 c# .net 中制作项目,但我严重卡在数据库查询中。

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

现在用户输入月份格式MM 和年份格式YY" 仅在文本框中(NOT DAY),如果用户条目(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 + "'";

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

【问题讨论】:

  • 我在使用这个查询时遇到了很多错误。
  • 与问题无关,但您可以edit您的问题,而不是在 cmets 中添加信息。
  • getDate 是 sql-server 函数 ...不是 mysql .. 请确认您的 db tag ..
  • 您可以这样做:以您所说的格式 (dd) 将天数添加到输入字符串的开头,并将其与数据库中的记录进行比较。 我的意思是添加01 到您的字符串的开头,这样无论数据库中的日期是什么,您的日期都将等于或小于该日期。
  • 你有一个巨大的 sql 注入漏洞,通过将文本框的文本值直接传递到 SQL 语句中......实际上,你存储的文本格式是什么?您可以将存储的数据类型更改为 date 而不是 varchar(50) 还是一成不变的?

标签: c# sql-server date


【解决方案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);

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

【讨论】:

  • 非常感谢@Chetan Ranpariya,它工作得很好!..也感谢所有提出建议的人:)
【解决方案2】:

首先,sql server 有一个 datetime 数据类型,因此您不应该将日期作为字符串存储在数据库中。

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

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

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

还有一点,以前的评论是对的,你永远不应该直接从文本框中获取文本并将其注入到 sql 字符串中。它为您打开了 sql 注入攻击的大门。相反,您应该使用参数。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多