如何获取特定月份和年份的所有条目?

时间:2015-06-05 18:34:33

标签: c# sql

我正在尝试

var dt = DateTime.Now.ToString();

string query = "SELECT * FROM Gigs where Date >= '"+dt+"';";

它似乎有用 - 除了它可以获得未来几个月的条目

然后我做

var dt = DateTime.Now.AddMonths(3).ToString();

string query = "SELECT * FROM Gigs where Date >= '"+dt+"';";

我得到的结果与预期相同

如果今天是1月1日,我想获得1月份的所有参赛作品,但是2月份没有。

这是只读数据,不关心SQL注入

2 个答案:

答案 0 :(得分:5)

首先,为什么需要在C#中计算日期并将其传递给SQL查询? 您可以使用DATEADDGETDATE()来避免这种情况:

--Will get three months before:
select DATEADD(MONTH, 3, GETDATE())

其次,你将来有三个月的时间。你确定你不想使用-3:

var dt = DateTime.Now.AddMonths(-3).ToString();

第三:使用参数化查询,这是示例:

using (var connection = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;"))
            {
                connection.Open();
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = "SELECT *   FROM [Test].[dbo].[SomeDates] WHERE dt > @MyDate";
                    var param = new SqlParameter("@MyDate", SqlDbType.DateTime2) { Value = DateTime.Now };
                    command.Parameters.Add(param);
                    var result = command.ExecuteReader();
                    while (result.Read())
                    {
                        Console.WriteLine(result.GetDateTime(0));
                    }
                }
            }

关于第二次的更新:看起来您希望将来获得查询。

更新#2 :即使您不关心SQL注入(但必须),您应该使用参数化查询,因为框架将负责日期时间格式和转换。否则它可能适用于您的机器,但不适用于其他机器/生产。

答案 1 :(得分:0)

如果要将日期转换为字符串,请确保您的区域设置如果使用不同的区域设置,则不会为sql server返回不同的日期。 6月5日可能是05-06-2015,但是如果你在sql-server中通过en-us传递它,它将把它解释为5月6日。

应始终使用通用格式yyyy-MM-dd从日期到字符串转换为sql server,无论区域设置如何,都不会在大多数软件中解释错误。

如果你按照建议使用SqlParameters,你真的不必担心这些不匹配,所以另一个+用于SqlParameter用法。