无法 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
在我的 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