无法选择日期范围之间的记录

时间:2019-06-16 09:16:14

标签: c# winforms datetimepicker

在Windows Form C#应用程序中,我将记录插入到SQL Server数据库中。除其他字段外,我还使用以下格式插入当前日期和当前时间:

DateTime currentDate = DateTime.Now;
string SaleDate = currentDate.ToString("dd-MM-yyyy");

DateTime currentTime = DateTime.Now;
string SaleTime = currentTime.ToString("hh:mm:ss tt");

哪种方法工作正常,并且记录可以成功插入日期和时间格式,例如this

但是,当我选择两个日期之间的记录时,无法执行此操作。我确定我的日期的这种自定义格式没有问题,因为我已经多次编辑相同的格式,甚至以默认格式保存了日期,但仍然无法选择目标记录(两个日期之间)

我在应用程序中使用以下select查询从视图vAllSales中选择记录,这将导致选择所有记录或SaleDate不符合指定过滤条件的记录:

select * from vAllSales where SaleDate >= '20-04-2019' and SaleDate <= '30-04-2019'"

我也在SQL Server中尝试了以下查询以检查原因:

1。

select * from vAllSales where SaleDate between '21-04-2019' and '09-05-2019'

上面的查询不返回任何值。像this

2。

select * from vAllSales where SaleDate >= '21-04-2019'

上面的查询仅选择一些记录。因为21-04-2019是初始的SaleDate,并且查询应该返回所有Sales,但它只返回一些记录,例如this

我的代码中指定的日期格式是否存在问题?还是我需要改进查询?对于这种情况,我需要一种更专业,更可靠的方法。

2 个答案:

答案 0 :(得分:3)

您应该将日期和时间存储为数据库中的datetime2对象。

它将为您带来以下好处:

  • 更好的排序:(您当前的字符串格式不允许自然排序)
  • 性能更好;因为您的日期和时间用数字而不是字符串表示
  • 更易于处理代码和查询:因为它直接映射到C#DateTime对象。

有关数据库类型的更多信息,请参见:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-2017

也许:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql?view=sql-server-2017


如果您绝对必须使用字符串来表示日期,请确保其位于sort-able ISO format中。

YYYY-MM-DD

由于这种格式的性质,它可以lexicographical作为字符串类型进行排序。

答案 1 :(得分:1)

您正在尝试将逻辑运算应用于字符串值。 lexicographical在这里进行比较。 (从左到右)。

因此,最好使用正确的data types将数据存储在表中。

但是,如果您真的想将日期存储为字符串,则必须在比较之前将其转换为适当的数据类型。

select * from vAllSales where  CAST(SaleDate AS DATE) >= '21-04-2019'

请注意,ms sql服务器将单引号用于传递日期时间。这并不意味着它们是字符串或varchar