Ms access 如何从日期变量中删除秒的分数? 背景:
我从Active Directory读取属性,并希望将其存储在SQL Server表中的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中:
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保存的额外十进制信息