SQL消除文本并保留数字,以小时为单位捕获数字

时间:2016-02-12 03:17:03

标签: sql ms-access ms-access-2013

我有一张叫做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*'));

仍在努力弄清楚如何解决几分钟和几天的字段。

1 个答案:

答案 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]上的索引,这意味着性能较差。我更喜欢将计算小时数存储在数据类型为数字(单或双)的单独字段中。