Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 如何从日期变量中删除秒的分数? 背景:_Ms Access_Vba_Odbc - Fatal编程技术网

Ms access 如何从日期变量中删除秒的分数? 背景:

Ms access 如何从日期变量中删除秒的分数? 背景:,ms-access,vba,odbc,Ms Access,Vba,Odbc,我从Active Directory读取属性,并希望将其存储在SQL Server表中的DATETIME2(0)列中。我不想存储几秒钟 这是一个8字节的整数,从1601年1月1日上午12:00开始以100纳秒的步长表示。我使用将其转换为日期变量 由于ODBC调用失败,此操作继续失败,我花了相当长的时间才发现该函数返回的额外精度导致了错误 问题: 从日期变量中删除几秒钟的最佳方法是什么 如何复制: 我使用SQL Server 2008 R2和Access 2010。 在SQL Server中:

我从Active Directory读取属性,并希望将其存储在SQL Server表中的
DATETIME2(0)
列中。我不想存储几秒钟

这是一个8字节的整数,从1601年1月1日上午12:00开始以100纳秒的步长表示。我使用将其转换为日期变量

由于
ODBC调用失败
,此操作继续失败,我花了相当长的时间才发现该函数返回的额外精度导致了错误

问题: 从
日期
变量中删除几秒钟的最佳方法是什么


如何复制: 我使用SQL Server 2008 R2和Access 2010。
在SQL Server中:

创建表TestDT(
ID INT不为空,
colDT2 DATETIME2(0)为空,
约束PK_TestDT主键(ID)
)
去
插入TestDT(ID)值(1)
去
使用本机客户端ODBC驱动程序或当前数据库将该表链接到Access。默认的“SQL Server”驱动程序实际上不知道如何使用DATETIME2

在Access VBA中:

Public Sub TestDT()

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim dte As Date
    Dim i As Long
    
    Set DB = CurrentDb
    
    ' Random date+time
    dte = CDate("2018-12-24 15:16:17")
    
    ' 1st iteration: write original date+time -> works
    ' 2nd iteration: try to write date+time with fractional seconds -> error for DATETIME2(0) column
    
    For i = 1 To 2
        If i = 2 Then
            ' Introduce milliseconds nastiness
            dte = dte + 0.00001
        End If
        Debug.Print "Iteration " & i, Format(dte, "yyyy-mm-dd hh:nn:ss")
            
        Set RS = DB.OpenRecordset("SELECT * FROM TestDT WHERE ID = 1", dbOpenDynaset)
    
        With RS
            .Edit
            !colDT2 = dte
            On Error Resume Next
            .Update
            
            If Err.Number <> 0 Then
                Debug.Print "Error " & Err.Number, Err.Description
                ' The DAO Errors collection shows the actual error
                Debug.Print Errors(0).Description
            Else
                Debug.Print "Update OK"
            End If
            On Error GoTo 0
            
            .Close
        End With
    Next i

End Sub
我想出了

dte = CDate(Int(dte) + TimeSerial(Hour(dte), Minute(dte), Second(dte)))
但这相当笨拙(

我想到了

dte = CDate(Int(dte) + TimeSerial(Hour(dte), Minute(dte), Second(dte)))

但这相当笨拙。(

你可以这样四舍五入到第二个:

PwdLastSetSecond = CDate(Int(PwdLastSet * 86400) / 86400)

您可以通过以下方式四舍五入到第二个:

PwdLastSetSecond = CDate(Int(PwdLastSet * 86400) / 86400)

清除时间部分的正确功能是:

DateValue(“日期/时间”表达式)

因此,你可以得到:

dte=日期值(CDate(“2018-12-24 15:16:17”))

或日期值(任意日期时间表达式)


清除时间部分的正确功能是:

时间值(“日期/时间”表达式)

因此,你可以得到:

dte=时间值(CDate(“2018-12-24 15:16:17”))

或时间值(任何日期/时间表达式)

如果需要将时间部分保存或删除为单独的值,请执行以下操作:

dtMyTime=时间值(CDate(“2018-12-24 15:16:17”))

然而,您的问题不是剥离日期或时间

格式中没有“.ms”这样的东西

这将给你一个月以上的时间

如果你仔细看:

2018-12-24 15:16:17.1217

在上图中,te 1217是12个月17秒

格式中没有“ms”这样的词。因此,这就是您看到溢出的原因

所以你不能使用“.ms”

您只能在访问中获得秒数

只需使用标准格式命令。如果您想去掉“额外”时间:

DANGER DANGER will Robinson。Access不使用或支持格式中的“ms”


只需在您获得的现有日期/时间上使用上述“格式”,即可在秒后提取并丢弃额外值。

Access中删除时间部分的正确功能是:

DateValue(“日期/时间”表达式)

因此,你可以得到:

dte=日期值(CDate(“2018-12-24 15:16:17”))

或日期值(任意日期时间表达式)


清除时间部分的正确功能是:

时间值(“日期/时间”表达式)

因此,你可以得到:

dte=时间值(CDate(“2018-12-24 15:16:17”))

或时间值(任何日期/时间表达式)

如果需要将时间部分保存或删除为单独的值,请执行以下操作:

dtMyTime=时间值(CDate(“2018-12-24 15:16:17”))

然而,您的问题不是剥离日期或时间

格式中没有“.ms”这样的东西

这将给你一个月以上的时间

如果你仔细看:

2018-12-24 15:16:17.1217

在上图中,te 1217是12个月17秒

格式中没有“ms”这样的词。因此,这就是您看到溢出的原因

所以你不能使用“.ms”

您只能获得访问的秒数

只需使用标准格式命令。如果您想去掉“额外”时间:

DANGER DANGER will Robinson。Access不使用或支持格式中的“ms”



只需在现有日期/时间上使用上述“格式”,就可以在秒后取出并扔掉额外的值。

魔法数字
86400
在我看来值得一个解释性的注释,或者更好的是,一个命名常量,例如
Const SecondsPerDay=86400
,这绝对不那么笨拙!)神奇的数字
86400
在我看来值得一个解释性的注释,或者更值得一个命名常量,例如
Const SecondsPerDay=86400
,这绝对不那么笨拙!:)我想知道你是否试过
!colDT2=format(dte,“yyyy-mm-dd hh:mm:ss”)
Hmm,很有趣。我没有,明天会试试。@krishkmeyes,那也行得通(虽然它是
“hh:nn:ss”
)。谢谢!如果在
hh
之后使用
mm
,它会做
nn
所做的:)哇,更多的日期/时间疯狂。你是对的。:o@krishKMI想知道你是否尝试过
!colDT2=format(dte,“yyyy-mm-dd hh:mm:ss”)
嗯,很有趣。我没有,明天会尝试。@krishkmeyes,那也行得通(虽然它是
“hh:nn:ss”
)。谢谢!如果在
hh
之后使用
mm
,它会执行
nn
的功能:)哇,更多的日期/时间疯狂。你是对的。:o@krishkmyu关于
的看法完全正确。ms
是胡说八道,我读了,但没有检查,甚至没有读到最后…这不是溢出的原因。--分配
格式(…,“MM-DD-YYYY hh:nn:ss”)
expression用于删除分数。但是@Andre,请注意,它将亚秒部分四舍五入到最接近的整数秒。它不会舍入秒的分数。这两种方法都没有错;选择哪种方法取决于上下文。这确实愚弄了我。我从未见过格式中的“.ms”-但提示是“month”而且“秒”看起来是一致的。这一切都很好,因为该格式确实去掉了th保存的额外十进制信息