【问题标题】:How to define if a string is date or datetime?如何定义字符串是日期还是日期时间?
【发布时间】:2015-04-05 05:30:51
【问题描述】:

我有传入的字符串,例如12.10.03 00:00:00.0000000。如何定义此字符串中是否有time 或只有date?

请注意,date 和 time 可以有不同的格式。例如:

  • 日期可以是January 03, 2012
  • 时间可以是1:1

【问题讨论】:

  • 里面有一个时间,正好是午夜。您想在午夜时排除所有字符串吗?
  • 我想知道字符串中有没有指定时间
  • 是否可以选择使用 CLR 函数?可能是您最好的选择,您可以运行正则表达式或利用 CLR 中提供的更强大的类型

标签: sql sql-server tsql date time


【解决方案1】:

你可以这样:

SELECT x = SUBSTRING('12.10.03 00:00:00.0000000', 1, 8);

编辑不同格式的代码;

SUBSTRING('12.10.03 00:00:00.0000000', 1,CHARINDEX(' ','12.10.03 00:00:00.0000000'));

【讨论】:

  • 首先你应该转换你的时间。您可以使用 CONVERT() 函数。转换后,将其添加到我的脚本中。
【解决方案2】:

使用LIKE 运算符;

if (@MyString like '%[0-9][0-9]:[0-9][0-9]:[0-9][0-9]%') ...

【讨论】:

    【解决方案3】:

    你可以写成:

    SELECT CASE WHEN PATINDEX( '%:%','12.10.03 00:00:00.0000000')> 0 THEN 'datetime'
                ELSE 'Date' END AS Result
    

    要验证日期,您可以使用ISDATE 函数。

    【讨论】:

    • 日期和时间可以有不同的格式,时间可以是1:02
    【解决方案4】:

    如果这不返回零,则有时间:

    SELECT DATEDIFF(SECOND,@VariableOrColumn,CAST(@VariableOrColumn AS DATE))
    

    如果需要,可以通过添加纳秒来增加 DATETIME2(7) 的精度。

    【讨论】:

      【解决方案5】:

      首先将您的字符串转换为日期时间以将其转换为正确的格式,然后将生成的日期时间转换为时间并将其与午夜作为时间和中提琴进行比较:

      Select Case when Cast(Cast(@yourstring as datetime) as Time) = Cast('00:00:00.0000000' as time) then Cast(@yourstring as date) else Cast(@yourstring as datetime) end
      

      【讨论】:

        【解决方案6】:

        if(@x='12.10.03').它是有效的日期时间,时间是00:00:00

        if(@x='12.10.03 00:00:00.0000000').它是有效的日期时间,时间又是 00:00:00 那么如果它包含时间是什么意思。

        你可以用不同的输入彻底测试这个脚本。我测试过并且运行良好。

        BEGIN TRY
        declare @x varchar(32) = '12.10.03 00:00:00.0000000'
        -- or '12.10.03' or '00:00:00.0000000' or '0000000' or 'fgdfgg'
        Declare @outputdt datetime2(7)
        Declare @hr int
        Declare @minute int
        Declare @sec int
        set @outputdt=@x
        --select @outputdt
        if isdate(LEFT(@x, 21))=1
        BEGIN
        
                select LEFT(@x, 21)
                select @hr=DATEPART(hour,@outputdt)
                ,@minute=DATEPART(minute,@outputdt)
                ,@sec=DATEPART(minute,@outputdt)
        END
        else
            BEGIN
            select @hr=DATEPART(hour,@outputdt)
                ,@minute=DATEPART(minute,@outputdt)
                ,@sec=DATEPART(minute,@outputdt)
            select 'Not valid1'
           END
        END TRY
        BEGIN CATCH
         select 'not valid'
        END CATCH
        
        select @hr,@minute
        
        if(@hr>0)
        select 'Todo'
        

        【讨论】:

          【解决方案7】:

          经过一些研发,我这样做了,我认为这会对你有所帮助。

          你没有提到 Sql 版本,所以这个示例将工作SQLSERVER2008 及以上

          更多信息:- http://blog.sqlauthority.com/2012/09/12/sql-server-get-date-and-time-from-current-datetime-sql-in-sixty-seconds-025-video/

          declare @s nvarchar(200) = '12.10.03' -- 00:00:00.0000000'
          
          --select CONVERT(time, @s) 
          
          Select 
              case 
                  when isdate(@s ) = 1 
                  then 
                      case 
                          when CONVERT(time, @s) = '00:00:00.0000000'
                          then 'no time'
                          else 'it has time'
                          end         
                  else 
                     'no time'
                  end
                  as dateHaveTimeOrNOT
          
          set @s = '12.10.03 01:20:00'
          
          Select cast (@s as date) , isdate(@s ),CONVERT(time, @s),
              case 
                  when isdate(@s ) = 1 
                  then 
                      case 
                          when CONVERT(time, @s) = '00:00:00.0000000'
                          then 'no time'
                          else 'it has time'
                          end         
                  else 
                     'no time'
                  end
                  as dateHaveTimeOrNOT
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-04-01
            • 2021-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多