显示小于当前日期的日期



在我的程序中,我有一个数据网格视图。我今天欠了一些款项。我显示了到期未付的金额(逾期(我想要一个显示日期小于当天当前日期的代码我尝试了下面的代码,但它只获取较低的日期,如果它大于或不大于当天的日期,则不查找月份或年份

tbl = db.readData("SELECT  * from Payments  where date_batch < CONVERT(varchar(50),GetDate(), 103)", "");
DgvSearch.DataSource = tbl;

前一个代码的问题是,它没有按天、月和年提取较低的日期。获取小于当前日期的日期(以天为单位(我只想以天、月和年为单位

好的,所以我假设date_batch是VARCHAR(10(或类似的,并且包含以下数据:

28/12/2021
29/11/2021
30/08/2021
31/12/2021

正如你所看到的;在人类看来像日期的字符串;秩序井然。它们不是按日期顺序排列的,而是按字母顺序排列的。最大的区别在于SQLServer按字母顺序对字符串进行排序。当你要求字符串";小于x〃;它使用字母排序规则来确定";小于"-ness

不要将日期存储在字符串中。SQLServer有几种特定于日期的数据类型。使用它们。

以下过程将把你从你自己挖的坑里挖出来:

ALTER TABLE Payments ADD COLUMN BatchDate DATE;
UPDATE Payments SET BatchDate = TRY_CONVERT(Date, date_batch, 103);

现在去看看你的桌子,检查一下是否正常:

SELECT * FROM payments WHERE batchdate is null and date_batch is not null

这显示所有未转换的日期。更正他们不稳定的坏数据,然后再次运行更新。

在所有数据中再进行一次选择,并对其进行观察;它看起来合理吗?你有没有任何日期被设定为2021年3月2日,而它们本应是2021年2月3日等

现在你的桌子上摆满了漂亮的枣子,去掉那些串;

ALTER TABLE Payments DROP COLUMN date_batch;

也许可以重命名列,但在SQLServer和c#WeCallThingsNamesLikeThis中,we_dont_call_them_name_like_this

sp_rename 'Payments.BatchDate', 'date-batch', 'COLUMN';

现在你可以做:

SELECT * FROM payments WHERE batchDate < GetDate()

并且不再将日期存储在字符串中

最新更新