通过c#按SQL过滤掉日期

时间:2014-10-22 20:20:27

标签: c# ms-access

你好女士们,先生们,

我的C#中的sql有问题。所以让我这么简单 这是我的代码:

OleDbConnection mydb;
OleDbCommand cmd;
OleDbCommandBuilder build;
OleDbDataAdapter adapter;
DataTable dt;
DataSet ds;
BindingSource bs;
String query;

public AnnualRateHistory()
{
    InitializeComponent();

    query = @"SELECT * FROM _Annual_Rate WHERE Date = 02/11/2014";
    build = new OleDbCommandBuilder(adapter);
    bs = new BindingSource();

    adapter = new OleDbDataAdapter(query, mydb);
    dt = new DataTable();
    adapter.Fill(dt);
}

好的我删除了很多代码以使其变得简单,但基本上我的问题必须在sql。我删除的代码是mydb.Open()并关闭了连接。 如果我使用该sql语句,则不会显示任何内容,并且它会精确地设置为数据库中的某个数据。如果我将'='替换为'>',那么一切都会显示出来;如果我使用'<'则没有任何显示。我知道日期应该是这样输入的:'02/11/2014'但由于某种原因,我得到的数据类型不匹配,而且在我的其他表单中,它的工作时间没有'

我无法找到SQL的任何错误。请告诉我我做错了什么。

这是表模式定义:

enter image description here

以下是表格中的数据:

enter image description here

3 个答案:

答案 0 :(得分:2)

两个问题 -

  1. 您的约会日期并不正确。这通常是最好的 使用ISO8601日期格式(即yyyy-MM-ddTHH:mm:ss)

  2. 您要求SQL服务器返回日期所在的行 确实 02/11/2014,这意味着当天的午夜。如果你想要那天的所有记录,那么它应该是:

    SELECT * FROM _Annual_Rate WHERE Date_Of_Rate > '2014-11-02' and Date_Of_Rate < '2014-11-03'
    
  3. 修改

    在看到您对问题的更新后,第2部分不再真正适用,因为看起来您只在Date_Of_Rate日期时间字段中存储日期。

    HOWEVER 第1部分仍然适用。在与SQL DB交谈时,日期应始终以ISO8601格式编写。

    2/11/2014 
    

    意味着11月2日在英国,但在美国意味着2月11日。许多国家/地区使用不同的日期格式,您无法始终保证服务器的设置方式,即使在您自己的国家/地区也是如此。这导致了我们(我工作的公司)过去的主要问题。在切换到ISO8601日期之前,我们指定了要写的日期:

    'dd-MMM-yyyy HH:mm:ss' (11-feb-2014 14:19:56) 
    
    直到一家法国公司为法国公司提供了一台带有SQL服务器设置的机器,这已经有一段时间了。 2月是Fév法语,因此所有与该机器一起出现的软件遭到轰炸。从那时起,我们吸取了教训。始终使用ISO8601日期格式。他们是获得完全不明确日期的唯一途径。

答案 1 :(得分:1)

查看架构时,问题似乎是您只是使用了错误的列名称 - 您的列名为Date_Of_Rate,但您要对名为Date的列进行过滤。

此外,Date是一个关键字,可能是您收到数据不匹配错误的原因。

所以只需将其改为此即可解决问题:

query = @"SELECT * FROM _Annual_Rate WHERE Date_Of_Rate = '02/11/2014'";

注意:语法适用于MySQL / SQL Server,因为问题最初被错误标记。

答案 2 :(得分:1)

我在这里看到了SQL的两个问题

  1. 当列实际为Date时,您会在Date_Of_Rate上进行过滤。
  2. 你需要把#34;#&#34;查询中的DateTime值。
  3. 如果这样做,您的查询应该起作用:

    query = @"SELECT * FROM _Annual_Rate WHERE Date_Of_Rate = #02/11/2014#";