【问题标题】:"Between" does not work, where is the mistake in my code?“Between”不起作用,我的代码中的错误在哪里?
【发布时间】:2021-01-19 06:27:31
【问题描述】:

我想寻求帮助,因为由于某种原因,带有 BETWEEN 的 SQL 子句对我不起作用 - 我得到 0 个结果。

插入记录时,我这样存储日期:

..
commandObject.Parameters.Add("date", c.Found.Date);

我遇到的问题是这永远行不通:

 commandObject.Parameters.Add("from", dateTimePicker_FROM.Value.Date.ToShortDateString());
                    commandObject.Parameters.Add("to", dateTimePicker_TO.Value.Date.ToShortDateString());
                    commandObject.CommandText = "Select * from Persons WHERE Date BETWEEN @from AND @to";

其他选择等工作正常。

【问题讨论】:

  • 你能告诉我们c.Date.ToShortDateString()的输出吗?
  • 你能更准确地解释一下doesn't work吗?并提供一些样本数据?我的第一个盲猜,虽然来自ToShortDateString - 为什么在你的数据库中使用字符串而不是日期时间?他们有不同的比较行为,你通常想要日期时间。
  • @TimBiegeleisen 当调试时,这将存储在参数中:{1/19/2021 12:00:00 AM}
  • 使用这个 CONVERT(datetime, @from)
  • 在 MySQL 中,日期必须是 'y-m-d',日期时间必须是 'y-m-d h:i:s'

标签: c# mysql date


【解决方案1】:

在 MySQL 中对日期使用 BETWEEN 条件时,请务必使用 CAST 函数将值显式转换为日期。

以下日期示例使用 BETWEEN 条件检索日期范围内的值:

选择 * FROM example_tbl WHERE order_date BETWEEN CAST('2021-01-19' AS DATE) AND CAST('2021-01-20' AS DATE);

更多信息请访问:https://www.techonthenet.com/mysql/between.php

【讨论】:

  • 谢谢,语法有效,但我仍然得到 0 个结果 :(
  • 你不需要这个演员; MySQL 将 'yyyy-MM-dd' 格式的字符串理解为日期
【解决方案2】:

您希望将日期作为日期而不是字符串传递:

 commandObject.Parameters.Add("from", dateTimePicker_FROM.Value.Date);

【讨论】:

    【解决方案3】:

    我不太确定为什么您似乎要存储日期(并设置日期参数),但是当您进行搜索时,您使用的是字符串而不是日期

    你说:

    commandObject.Parameters.Add("date", c.Found.Date);
    

    这看起来很奇怪;我不记得需要一个字符串和一个值的 Add 重载(假设您使用 the MySQL connector)-您的意思是 AddWithValue 吗?

    我假设:

    • 你的意思是说 AddWithValue
    • 您的查询类似于 `INSERT INTO T VALUES(..., @date, ...)
    • 您的参数“日期”用于存储日期、日期时间或时间戳的列
    • c.Found 是一个 c# 日期时间,您使用 Date 属性将时间设置为午夜

    假设 c.Found 是 2020-01-02 12:34:56,这意味着您的表应该以 2020-01-02 00:00:00 结束

    现在将您的选择器设置为 2020-01-01 和 2020-01-03

    像这样运行搜索:

    SELECT * FROM t WHERE date BETWEEN @f AND @t
    

    设置您的参数,如:

    commandObject.Parameters.AddWithValue("@f", fromPicker.Value.Date);
    commandObject.Parameters.AddWithValue("@f", toPicker.Value.Date);
    

    即让它们成为日期,而不是字符串

    它会起作用的

    BETWEEN 在范围的两端都包含在内,因此从选择器或到选择器可以是 2020-01-02,它仍然会拾取。将日期视为整数,将时间视为小数。 2020-01-02 00:00:00 就像 2.0,2020-01-02 18:00:00 就像 2.75,2020-01-03 00:00:00 就像 3.0。这意味着 BETWEEN 2020-01-02 AND 2020-01-03 将在这些日期的午夜获取任何内容,以及介于两者之间的所有内容,就像 BETWEEN 2 AND 3 会给您提供 2、2.5、3 的行......但它不会给你 3.5,同样它不会给你 2020-01-03 12:00:00 如果中间在 2020-01-03 结束

    【讨论】:

    • 谢谢,我使用嵌入式 sqldatabase,添加参数对的唯一方法是 Add。没有 AddWithValue 方法。
    • 您可以调整建议以使用添加,然后.. 或发布更多关于您使用的确切信息的信息。您提供的唯一线索是标签“mysql”,因此我针对 mySQL 建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多