日期值在每个月的第一天以不同的格式返回

Date value returning in a different format on the first of each month

这个问题与 this one 有关,但我想我会创建一个新的 post,因为它不是完全相同的问题,而且关于它的想法只是重复。

我的 Crystal 报告有一个 select 离子公式。它应该是 select 数据,其中一个 table 中的 Stage 字段为 6,而另一个 PaymentDate 字段小于或等于 DateTimePicker控制.

我下面的代码在大多数日期都运行良好。但是,例如我在数据库中有以下数据:

Sales_Headers.Stage = 6
Sales_Lines.PaymentDate = 28/01/2017 (January 28th, 2017)

选择1月26日至1月31日的日期时,只有在日期为28或更高时才能检索数据。但是,如果我然后 select 2 月 1 日的日期(或者准确地说是任何一个月的 1 日),它返回的日期为 02/01/2017,或者 2017 年 1 月 2 日,所以数据是'未显示。

为什么它只在每个月的 1 号发生变化?所有其他日期都被正确读取,如 dd/MM/yyyy,但首先,它使用 MM 部分作为 dd 部分。

我试过:

Dim dateTo As Date = dtpCRTo.Value.AddDays(1).Date
    dateTo = Format(dateTo, "dd/MM/yyyy")
   If cmbCRSupplier.Value = "" Then
     selectionFormula = "{Sales_Headers.Stage} = '6' AND {Sales_Lines.PaymentDate} < #" & dateTo & "#"

然后我在 form_Load 事件以及 DateTimePickerValue_Changed 事件中尝试了这个:

Dim dateFormat As String
dt.Format = DateTimePickerFormat.Custom
dt.CustomFormat = "dd/MM/yyyy"
dateFormat = dt.Text

我尝试的最后一件事就是没有格式化代码,只使用:

If cmbCRSupplier.Value = "" Then
  selectionformula = "{Sales_Headers.Stage} = '6' AND {Sales_Lines.PaymentDate} <= #" & dtpCRTo.Value.Date & "#"

但所有的结果都是一样的。

除了@Siva 所说的方法(总是一个好方法,这样你可以在那里创建公式并使用它正在寻找的语法),还有你正在尝试的方法它在 VB.NET.

正如我刚才提到的,语法很重要,这就是导致您出现问题的原因。 我以前没有看到有人尝试在这种方法中使用 DateTimes,使用`#value#.

将日期格式化为 RecordSelectionFormula 的正确方法(同样,如果您在 Crystal 中创建它,您将会看到它),是 DATE(yyyy, MM, dd).

因此,语法的正确方法是使用:

selectionFormula = "{Sales_Headers.Stage} = '6' AND {Sales_Lines.PaymentDate} <= DATE(" & _
 dtpCRTo.Value.Date.Year & "," & dtpCRTo.Value.Date.Month & "," & dtpCRTo.Value.Date.Day & ")"

以后用这个方法把你的日期插入到选择公式中,这样就不会弄错了。

如果这不起作用,那么您需要检查控制面板中的区域和本地 Date/Time 设置,以确保它们设置正确。