我有一张叫做VISIT REPORT的桌子。报告中有一列名为“小时费用”,我想对其进行更改。
由于从其他来源导入的数据,一些花费的小时记录被记录为例如“1小时”,“2分钟”,“3天”。我想删除文本并保留数字,以小时为单位捕获数字。我怎么做,因为有三个不同的单位?
这是我的代码,用于识别包含“小时”,“分钟”,“日期”甚至“小时”,“分钟”,“d”等字词的记录
SELECT *
FROM [VISIT REPORT]
WHERE ((([VISIT REPORT].[Hours Spent]) Like '*h*' Or ([VISIT REPORT].[Hours Spent]) Like '*m*' Or ([VISIT REPORT].[Hours Spent]) Like '*d*'));
我被困在这里。我尝试添加此代码,我认为这是错误的,因为它没有注意到三个不同的单位,小时,分钟和天。
UPDATE VISIT REPORT SET [Hours Spent] = Val([Hours Spent])
现在我将问题分成三个查询,然后从一个查询开始,先将字段修复为小时。 - 它有效!
首先创建一个模块,
Function RemoveAlphas(ByVal AlphaNum As Variant)
Dim Clean As String
Dim Pos, A_Char$
Pos = 1
If IsNull(AlphaNum) Then Exit Function
For Pos = 1 To Len(AlphaNum)
A_Char$ = Mid(AlphaNum, Pos, 1)
If A_Char$ >= "0" And A_Char$ <= "9" Then
Clean$ = Clean$ + A_Char$
End If
Next Pos
RemoveAlphas = Clean$
End Function
然后插入此SQL,
UPDATE [VISIT REPORT] SET [VISIT REPORT].[Hours Spent] = "RemoveAlphas[Hours Spent]"
WHERE ((([VISIT REPORT].[Hours Spent]) Like '*h*'));
仍在努力弄清楚如何解决几分钟和几天的字段。
答案 0 :(得分:2)
Val([Hours Spent])
会为您提供初始号码。然后,您可以使用Switch
表达式确定乘法因子,以小时为单位表示初始数字。
UPDATE [VISIT REPORT]
SET [Hours Spent] =
CStr
(
Val([Hours Spent])
*
Switch
(
[Hours Spent] Like '*day*', 24,
[Hours Spent] Like '*hour*', 1,
[Hours Spent] Like '*min*', (1/60)
)
)
WHERE [Hours Spent] Like '*[dhm]*';
下表显示了您的样本值及其计算的等效小时数:
Hours Spent replacement text (hours)
----------- ------------------------
1 hour 1
2 minutes 3.33333333333333E-02
3 days 72
虽然这可以满足您的要求,但我对它有疑虑,因为将数字存储为文本很少是最佳选择。只要您希望将这些文本值用作数字,就必须相应地转换它们。在这种情况下,您的查询将无法利用[Hours Spent]
上的索引,这意味着性能较差。我更喜欢将计算小时数存储在数据类型为数字(单或双)的单独字段中。