无法 select 日期范围内的记录

Unable to select records between date range

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

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

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

效果很好,并且使用 .

等日期和时间格式成功插入了记录

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

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

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

我也在我的 SQL 服务器中尝试了以下查询来检查原因:

1.

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

以上查询没有 return 任何值。喜欢

2.

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

上面的查询select只有几条记录。因为 21-04-2019 是初始的 SaleDate 并且查询应该 return 所有 Sales 但它只有 return 一些记录,例如

我的代码中指定的日期格式有问题吗?还是我必须努力改进我的查询?对于这个案例,我需要更专业、更可靠的方法。

您应该将日期和时间作为 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 sort-able 作为字符串类型。

您正在尝试对字符串值应用逻辑运算。这里会发生的是 lexicographical 比较。 (从左到右)。

所以你最好使用正确的data types来存储数据到table。

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

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

请注意 ms sql 服务器对传递日期时间使用单引号。这并不意味着那些是字符串或 varchar