【问题标题】:Select rows base on their date根据日期选择行
【发布时间】:2018-01-23 11:03:02
【问题描述】:

如果行满足某些条件,我将为列选择SUM,但问题是其中一个条件必须是该日期小于今天的日期。

我在 4 个连接字符串上使用 1 个命令字符串(4 个不同的数据库 4 年)

我已经研究了THIS 的问题,但我不明白我应该怎么做。

目前我有这个命令:

SELECT SUM(UPLACENO) FROM DOKUMENT WHERE VRDOK = 15 AND FLAG = 1 AND KODDOK = 0

这就是我使用它的方式:

FbConnection con1..... //this year
{
    FbCommand cmd = new FbCommand(commandUpAbove);
    ....
}

FbConnection con2..... //year before
{
    FbCommand cmd = new FbCommand(commandUpAbove);
    ....
}

FbConnection con3..... //2 years before
{
    FbCommand cmd = new FbCommand(commandUpAbove);
    ....
}

FbConnection con2..... //3 years before
{
    FbCommand cmd = new FbCommand(commandUpAbove);
    ....
}

我想要完成的是:

  1. 如何选择列DATUM (datetime) 小于myDate (dd/MM) 的行

  2. 由于我在 4 个数据库中使用相同的命令,我如何设法告诉它选择 where date < mydate 但不给他年份

每个数据库的期限为 1 年(一年的 01.01 - 31.12)。

【问题讨论】:

  • 将所需日期作为参数传递,从今天的日期/时间中减去所需的年数。请参阅:stackoverflow.com/questions/2992451/…
  • 它们实际上是 4 个不同的数据库吗?你能改变它吗?
  • 什么日期?样本数据和期望的结果真的很有帮助。
  • 它们是 4 个不同的数据库,它可以工作,但我不知道如何在日期需要小于假设“31.01”的所有年份使用一个命令字符串
  • 查看已编辑的问题

标签: c# sql winforms firebird


【解决方案1】:

试试这样的:

string commandUpAbove = "SELECT SUM(UPLACENO) FROM DOKUMENT WHERE VRDOK = 15 AND FLAG = 1 AND KODDOK = 0 AND DATUM < '?';";

对于您的每个查询,请使用:

FbConnection con1..... 
{
   FbCommand cmd = new FbCommand(commandUpAbove.Replace("?", mydate.ToString()));
    ....
}

编辑:正如 cmets 中所指出的,只有在代码中定义了 mydate 时才应该使用它。如果用户在文本框中输入 mydate,则不要使用它。相反, mydate 应该是某种 DateTime。还有其他通常更快或更好的方法可以将参数插入 sql 命令。

【讨论】:

  • 这种方法既脆弱、不安全又有点慢 - bobby-tables.com - 相反,必须使用强类型的参数。就像firebirdsql.org/en/net-examples-of-use的示例 #2 一样
  • 也可以在ibprovider.com/eng/documentation/…看到“带参数查询”示例
  • 不要使用带问号的文字字符串,使用实参(即不带引号的问号...
  • if mydate is defined in code - 即使那样也很糟糕:使代码脆弱,缺乏类型安全,绑定到特定的 SQL 服务器及其关于日期文字格式的想法(可能稍后更改),并使 SQL 查询重新编译每行一次又一次。参数化的准备查询,无需重新编译而仅更改变量即可执行,是一种正确的方法
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 2017-01-11
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多