在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");
哪种方法工作正常,并且记录可以成功插入日期和时间格式,例如。
但是,当我选择两个日期之间的记录时,无法执行此操作。我确定我的日期的这种自定义格式没有问题,因为我已经多次编辑相同的格式,甚至以默认格式保存了日期,但仍然无法选择目标记录(两个日期之间)
我在应用程序中使用以下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'
2。
select * from vAllSales where SaleDate >= '21-04-2019'
上面的查询仅选择一些记录。因为21-04-2019
是初始的SaleDate
,并且查询应该返回所有Sales
,但它只返回一些记录,例如。
我的代码中指定的日期格式是否存在问题?还是我需要改进查询?对于这种情况,我需要一种更专业,更可靠的方法。
答案 0 :(得分:3)
您应该将日期和时间存储为数据库中的datetime2对象。
它将为您带来以下好处:
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