毫秒时间:按日期过滤表格

时间:2015-01-07 14:23:45

标签: ms-access access-vba

我正在尝试使用此方法在Access 2010/13中实现毫秒时间戳; MS Access Can Handle Millisecond Time Values--Really - See more at:

通过以下方式查询毫秒值; SELECT DateValueMsec([DateTimeMs]) AS DateOnly FROM - 提供仅限日期控件以从文本框中对表单进行排序。 在DateOnly yeilds 0结果上以编程方式应用的任何过滤器。

Private Sub BuildFilter()
    Dim strFilter As String
    Dim ctl As Control

    strFilter = ""

'add selected values to string
    For Each ctl In Me.FormHeader.Controls
        With ctl
            If .ControlType = acTextBox Or .ControlType = acComboBox Then
                If Nz(.Value) <> "" Then
                    If InStr(.Name, "Date") <> 0 Then
                        If Nz(StartDate) <> "" And Nz(EndDate) <> "" And InStr(strFilter, "DateOnly") = 0 Then
                            strFilter = strFilter & "[DateOnly] BETWEEN #" & Me.StartDate.Value & "# AND #" & Me.EndDate.Value & "# AND "
                        ElseIf Nz(StartDate) <> "" And InStr(strFilter, "DateOnly") = 0 Then
                       strFilter = strFilter & "[DateOnly] >= #" & DateValueMsec(Me.StartDate.Value) & "# AND "
                     '       strFilter = strFilter & "[DateOnly] >= #" & Me.StartDate.Value & "# AND "
                        ElseIf Nz(EndDate) <> "" And InStr(strFilter, "DateOnly") = 0 Then
                            strFilter = strFilter & "[DateOnly] <= #" & Me.EndDate.Value & "# AND "
                        End If
                    ElseIf InStr(.Name, "ID") <> 0 Then
                        strFilter = strFilter & "[" & .Name & "] = " & .Value & " AND "
                    Else
                        strFilter = strFilter & "[" & .Name & "] = '" & .Value & "' AND "
                    End If
                End If
            End If
        End With
    Next ctl
'trim trailing
    strFilter = TrimR(strFilter, 5)

Debug.Print strFilter
    With Me.subfrmzzAuditTrailDisplay
        .Form.Filter = strFilter
        .Form.FilterOn = True
    End With
End Sub

1 个答案:

答案 0 :(得分:0)

答!来自@pathDongle

时间存储为毫秒UTC;

!DateTimeMS = GetTimeUTC()

并恢复;

Public Function UTCtoTimeLocal(dSysUTC As Date) As Date
'Dim sysTime As SYSTEMTIME
    Dim DST As Long
    Dim tzi As TIME_ZONE_INFORMATION

    DST = GetTimeZoneInformation(tzi)
    UTCtoTimeLocal = dSysUTC - TimeSerial(0, tzi.Bias, 0) + IIf(DST = 2, TimeSerial(1, 0, 0), 0)
End Function

查询;

SELECT tblzzAuditTrail.DateTimeMS, FormatDate(UTCtoTimeLocal([DateTimeMS])) AS DateTimeLocal

可以作为字符串过滤。

Private Sub BuildFilter()
    Dim strFilter As String
    Dim ctl As Control

    strFilter = ""

'add selected values to string
    For Each ctl In Me.FormHeader.Controls
        With ctl
            If .ControlType = acTextBox Or .ControlType = acComboBox Then
                If Nz(.Value) <> "" Then
                    If InStr(.Name, "Date") <> 0 Then
                        If Nz(StartDate) <> "" And Nz(EndDate) <> "" And InStr(strFilter, "DateTimeLocal") = 0 Then
                            strFilter = strFilter & "[DateTimeLocal] BETWEEN '" & FormatDate(Me.StartDate.Value) & "' AND '" & FormatDate(Me.EndDate.Value) & "' AND "
                        ElseIf Nz(StartDate) <> "" And InStr(strFilter, "DateTimeLocal") = 0 Then
                            strFilter = strFilter & "[DateTimeLocal] > '" & FormatDate(Me.StartDate.Value) & "' AND "
                        ElseIf Nz(EndDate) <> "" And InStr(strFilter, "DateTimeLocal") = 0 Then
                            strFilter = strFilter & "[DateTimeLocal] <= '" & FormatDate(Me.EndDate.Value) & "' AND "
                        End If
                    ElseIf InStr(.Name, "ID") <> 0 Then
                        strFilter = strFilter & "[" & .Name & "] = " & .Value & " AND "
                    Else
                        strFilter = strFilter & "[" & .Name & "] = '" & .Value & "' AND "
                    End If
                End If
            End If
        End With
    Next ctl
'trim trailing And
    strFilter = TrimR(strFilter, 5)

Debug.Print strFilter
    With Me.subfrmzzAuditTrailDisplay
        .Form.Filter = strFilter
        .Form.FilterOn = True
    End With
End Sub

产生的过滤字符串;

[UserID] = 2 AND [DateTimeLocal] BETWEEN '06/01/2015 00:00:00.000' AND '07/01/2015 00:00:00.000'

根据我的另一个问题;

millisecond-time-msec2-incorrect-return