将DateTime与Microsoft SQL和Visual C#进行比较

时间:2018-12-08 17:17:50

标签: c# sql datetime oledb

我正在尝试将DateTime与给定日期进行比较。

string conString = @"Provider=Microsoft.JET.OLEDB.4.0;" + @"data 
source=C:\\myDB.mdb";
OleDbConnection conn = new OleDbConnection(conString);
conn.Open();
DataSet ds = new DataSet();
String q = "SELECT * FROM Booking WHERE CheckIn < DATE()";
//String q = "SELECT * FROM Booking WHERE CheckIn < '01.01.2020'";
//String q = "SELECT * FROM Booking WHERE CheckIn < 01.01.2020";
//String q = "SELECT * FROM Booking WHERE CheckIn < '01.01.2020 00:00:00'";
//String q = "SELECT * FROM Booking WHERE CheckIn < 01.01.2020 00:00:00";
OleDbDataAdapter adapter = new OleDbDataAdapter(q, conn);
Console.WriteLine(q);
adapter.Fill(ds);
conn.Close();
DataTable dt = ds.Tables[0];
if (dt.Rows.Count > 0)
{
   MessageBox.Show(dt.Rows[0][0].ToString());
}
else
{
     MessageBox.Show("0 found");
}

代码显示了如何将其与当前时间进行比较。工作正常,结果为

01.12.2018 00:00:00

。但是,如果我尝试将currentTime替换为特定值(请参阅我所尝试的内容),则会抛出System.Data.OleDb.OleDbException或SQL语法错误。我现在有点困惑,因为DATE()返回的值与我尝试过的格式完全相同。有人知道我在想什么吗?

最诚挚的问候

克鲁斯佩

1 个答案:

答案 0 :(得分:1)

使用此格式:

yyyy-MM-dd

这被称为ISO-8601标准日期格式,在输入日期文字时,几乎任何语言都应始终使用它:

2020-01-01

虽然我在这里,但是在引发异常的情况下,发布的代码有可能泄漏连接对象。更好的做法是将连接包含在using块中。顺便说一句,如果对此使用参数化查询,则格式突然变得无关紧要。

string dbPath = @"C:\myDB.mdb";
string conString = $"Provider=Microsoft.JET.OLEDB.4.0;data source={dbPath}";
string q = "SELECT * FROM Booking WHERE CheckIn < ?";
Object result = null;

using (var conn = new OleDbConnection(conString))
using (var cmd = new OleDbCommand(q, conn))
{
    cmd.Parameters.Add("Date", OleDbType.Date).Value = new DateTime(2020, 1, 1);
    Console.WriteLine(q);
    result = cmd.ExecuteScalar();
}

if (result == null || result == DBNull.Value)
{
    result = "0 found";
}
MessageBox.Show(result.ToString());