我正在尝试
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注入
答案 0 :(得分:5)
首先,为什么需要在C#中计算日期并将其传递给SQL查询?
您可以使用DATEADD
和GETDATE()
来避免这种情况:
--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用法。