【问题标题】:Query not returning all records based on just the date from a date-time field查询不仅基于日期时间字段中的日期返回所有记录
【发布时间】:2019-12-05 14:49:16
【问题描述】:

作为 POS 程序的一部分,我将日期时间值存储在字段中。要查看特定日期的销售额,我需要能够仅根据日期检索所有记录 - 不包括时间。我找到了一些我认为有效的代码,但我无法以个位数的天数返回任何记录...... 2019 年 12 月 5 日与 2019 年 11 月 26 日。这是我的代码。 TimeStamp.text 包含一个日期,例如 12/4/2019 6:33:00 PM。我正在连接访问数据库。

Private Sub TimeStamp_DoubleClick(sender As Object, e As EventArgs) Handles TimeStamp.DoubleClick
    Dim dt As Date = Date.Parse(TimeStamp.Text)
    Dim dateString = dt.ToShortDateString()
    SalesBindingSource.Filter = "DateStamp = '" & dateString & "'"
    SalesBindingSource.Sort = "SalesID DESC"
    Infobox.Text = "All records from " & dateString
    GetTax()
    TotalRows()
End Sub

【问题讨论】:

  • 这可能是由于使用了日期格式。我猜你希望使用mm/dd/yyyy,而格式可能是'dd/mm/yyyy`
  • Dim dt As Date = Date.Parse(TimeStamp.Text) Dim dateString = dt.ToShortDateString() 行在 dateString 变量中返回“11/6/2019”。除了额外的时间部分外,这与我的数据库格式相同。我确信它与格式化有关,因为检索两位数的日期没有问题。

标签: sql vb.net ms-access


【解决方案1】:

也许它预计是 2 位数的一天。

    Dim dt As Date = Date.Parse(TimeStamp.Text)
    Dim dateString = dt.ToString("MM/dd/yyyy")

【讨论】:

  • 谢谢玛丽。昨晚我玩了一个小时的格式并放弃了。如此微小的变化,却是向前迈出的一大步。
【解决方案2】:

您真的不想开始将日期值转换为字符串,并且不希望数据引擎将某些字符串视为日期的“希望”。

在 ACE/JET 中,有一个内置函数可以去除时间部分。

例如:

Select ID, CustID, DATEVALUE(PurchaseDate) as Pdate from tblInvoices

如果你要在上面查询?然后你使用格式正确的日期:

SELECT ID, CustID, DATEVALUE(PurchaseDate) AS Pdate from tblInvoices
WHERE Pdate = #12/06/2019#

因此,您可以在查询中使用 Access DATEVALUE() 函数。但是,请记住,高速索引不能与上述一起使用。那么,如果表很大呢?你想要这个:

SELECT ID, CustID, PurchaseDate from tblInvoices
WHERE PurchaseDate >= #12/06/2019# AND PurchaseDate < #12/07/2019#

因此,如果表不是太大,或者您有其他标准限制使用某些索引提取数据,则应使用 DATEVALUE() 去除时间部分。但是,对于大表,这会导致索引丢失,并会导致全表扫描。因此,最好发送数据标准的整个“范围”。

【讨论】:

  • 非常感谢 Kallal 先生。摆脱日期的时间部分真的是我所需要的。虽然我的代码现在可以工作,但我计划返回并使用您的解决方案解决这个问题。我同意“希望引擎”能够确定日期是一种不好的做法。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多