【问题标题】:MySQL filter by dateMySQL 按日期过滤
【发布时间】:2021-11-03 18:11:30
【问题描述】:

我正在构建一个像这样的query string

string query = "SELECT * FROM " +  table + " where DATE(Date) > " + howFarBack.ToString("yyyy-MM-dd");

然而,当它执行时

while (dataReader.Read())

我看到日期早于howFarBack ????

    public List<OHLC> Select(string table, System.DateTime howFarBack)
    {
            string query = "SELECT * FROM " +  table + " where DATE(Date) > " + howFarBack.ToString("yyyy-MM-dd");

            //Create a list to store the result
            var list = new List<OHLC>();

            //Open connection
            if (OpenConnection() == true)
            {
                //Create Command
                MySqlCommand cmd = new MySqlCommand(query, connection);
                //Create a data reader and Execute the command
                MySqlDataReader dataReader = cmd.ExecuteReader();

                
                //Read the data and store them in the list
                while (dataReader.Read())
                {
                    var ohlc = new OHLC();

                    ohlc.Date = (System.DateTime)dataReader[0];
                    ohlc.Open = Math.Round((double)dataReader[1], 2);

【问题讨论】:

  • 请使用参数化查询 - 通过连接等方式构建 SQL 查询是灾难的根源。它不仅是许多难以调试的语法错误的来源,而且还是 SQL Injection attacks 的大门。它很可能还可以解决您的直接问题。
  • 另外,您应该缓存连接对象,而是在使用后创建和处置。所以OpenConnection() == true 而不是你想要using(var connection = new MySqlConnection...。你还需要using cmddataReader

标签: c# mysql


【解决方案1】:

如有疑问,请尝试通过检查生成的 SQL 查询而不是格式化 SQL 查询的 C# 代码来进行调试。

我猜您的查询缺少日期文字周围的单引号分隔符。所以它最终是这样的查询:

SELECT * FROM MyTable where DATE(Date) > 2021-11-02

但是 2021-11-02 不是日期,它是一个算术表达式,计算结果为整数:2021 减 11 减 2 = 2008。这肯定会匹配很多您不希望的日期。

您可以通过确保在日期文字周围使用正确类型的引号来解决此问题(它实际上是一个字符串文字,与日期相比被解释为日期)。

SELECT * FROM MyTable where DATE(Date) > '2021-11-02'

但使用查询参数要好得多,正如上面评论中提到的那样。

SELECT * FROM MyTable where DATE(Date) > @howFarBack

那么你就不需要引号了。事实上,您必须在参数占位符周围使用引号。

请参阅Parameterized Query for MySQL with C# 或许多其他参考资料,了解如何在 C# 的 SQL 语句中使用参数。

还请记住,参数只能用于代替单个文字值。您不能将参数用于表或列标识符、值列表或 SQL 关键字等。

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多