2013-02-23 100 views
-1

我有一个字段有时包含像串以下:2/23/2013 12:25:55~45拆分和分析数据

我需要串在拆分〜并确定是否还剩下些什么的〜是一个有效的日期时间值〜的正确值是一个有效的整数。基本上我想返回的是否是这些条件是正确的真/假。

请记住,该字段可能包含空值,可能包含任何其他类型的数据,并且可能包含多个波形符号。在所有情况下,我需要返回false。我需要返回true的唯一时间是该字段包含日期/时间值,单个代字号和整数。

+0

好的...和[你试过什么](http://www.whathaveyoutried.com)? – Kermit 2013-02-23 19:30:06

+0

什么版本的sql server?对于T-SQl字符串函数和T-SQl日期函数的快速Google,现在可以完成此操作。 – 2013-02-23 19:32:57

回答

2

在SQL Server中,你可以这样做:

select (case when col like '%~%' 
      then (case when isdate(left(col, charindex('~', col) - 1)) = 1 and 
          isnumeric(substring(col, charindex('~', col)+1, 1000)) = 1 and col not like '%~%.%' and col not like '%~%e%' 
         then 1 
         else 0 
        end) 
      else 0 
     end) as IsFunkyFormat, substring(col, charindex('~', col)+1, 1000), left(col, charindex('~', col) - 1) 

的巢式病例是为了防止错误时,未找到的分隔符。 not like表达式旨在排除不是整数的数字格式。

+0

我正在处理这个问题的答案。我刚刚测试了您的解决方案,并注意到如果输入字符串是单个空格或空字符串,则会出现错误。 – 2013-02-23 21:24:51

+0

@Gasastros。 。 。当我测试这些值时,它正确返回“0”。它也为''〜'返回零,所以我不知道你指的是什么。 – 2013-02-23 21:29:12

+0

我的歉意。正是这个“导致错误的”(Data,charindex('〜',Data) - 1)“,这不是真正的解决方案,而仅仅是测试代码。 – 2013-02-23 21:33:17

0

这个问题比看起来更复杂,因为它很容易出错,或者以现在适用于您的给定数据集的方式编写,但无法为其他数据集工作。

如果这是您存储在数据库中的数据,我强烈建议您了解数据库规范化。规范化的一个原则是你只在一列中存储一个值。在这种情况下,您将日期时间和整数值存储在同一列中。将数据存储在多个列中会好得多。这就是说,我知道有些时候您需要将一些原始数据导入数据库。通常情况下,我们无法控制我们提供的原始数据,因此我们必须处理SQL体操。在这种特殊情况下,有几种不同类型的后翻将会很有用。

  1. 确定字符串中的字符数。
  2. 在代字号上分割数据。
  3. 确保其中一个值是日期时间
  4. 确保其他值是整数。

只有4项中的1项内置到SQL Server中。有一个函数名称IsDate接受一个字符串参数,并返回一个位,指示该字符串表示的日期是否可以转换为日期。

要确定您的字符串〜的数量,关键是要确定与波浪的字符串的长度和字符串的长度没有波浪的。我们能确定哪些行包含单个波浪做这个:

When Len(Data) = Len(Replace(Data, '~', '')) + 1 

另一个棘手的问题,解决的是,以确定是否一个字符串代表一个整数。有多种方法可以做到这一点,但我最喜欢的方法是将硬编码值连接到数据,然后测试数字。例如,对于字符串1e4,IsNumeric函数将返回true,因为e表示科学记数法,1e4可以解释为1000。所以,如果你这样做:

IsNumeric(Data + 'e0') 

这将返回科学记数法错误,因为数据可能会像1E4,这将连接到“E0”得到“1e4e0”,这是不是数字。同样,我们可以将.0连接到字符串以检查分数。如果你的数据是45.2(它是数字的),并且你将它串联起来,你会得到'45.0.0',这不是数字。您还可以在测试中添加' - '以检查正数。 '-20'是数字,但' - '+'-20'(即' - 20')不是数字。

Select YourColumnHere, 
     Len(Replace(YourColumnHere, '~', '')) + 1, 
     Case When Len(YourColumnHere) = Len(Replace(YourColumnHere, '~', '')) + 1 
      Then 
        Case When IsDate(Left(YourColumnHere, CharIndex('~', YourColumnHere)-1)) = 1 
         Then 
           Case When Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) > '' 
            Then IsNumeric('-' + Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) + '.0e0') 
            Else 0 
            End 
         Else 0 
         End 
      Else 0 
      End 
From YourTableNameHere