【问题标题】:convert string to both date and time将字符串转换为日期和时间
【发布时间】:2017-02-22 20:53:44
【问题描述】:

我有一个数据,其中日期和时间以 yyyymmdd_time (20161012_1528) 格式出现。

我想将其转换为 SQL Server DB 中的日期时间为 2016-10-12 15:28:00:00

是否有任何直接的方法可以做到这一点。或者必须创建一个自定义函数?

【问题讨论】:

    标签: sql sql-server tsql datetime sql-server-2014


    【解决方案1】:
    Declare @String varchar(25) = '20161012_1528'
    
    Select cast(left(@String,8)+' '+Stuff(right(@String,4),3,0,':') as datetime)
    

    或者

    Select cast(Stuff(Replace(@String,'_',' '),12,0,':') as datetime)
    

    返回

    2016-10-12 15:28:00.000
    

    【讨论】:

    • @Sami 非常友善。总是很高兴听到其他开发人员的意见
    • 但是我相信当我们使用 Stuff 时它会阻碍性能。虽然 Datetime.ParseExact 对我不起作用.. 有没有人有任何示例如何在 C# 中使用 datetime.parseexact 转换为日期时间我的格式
    • @user1046415 只是因为你让我好奇,我对 50,000 条记录进行了快速测试。选择(到屏幕)而不计算 397 毫秒。计算时间为 458 毫秒。平均每次运行 5 次的时间
    • @user1046415 更新:我正在播放 NetFlix。没有 NetFlix 344.6 和 354.2 的结果(计算成本为 10 毫秒)
    • 好的。我会尝试索引,看看它是否在我的情况下有所改善.. 谢谢
    【解决方案2】:

    请尝试以下方法, 它需要使用一些日期时间和转换函数

    declare @dt datetime
    declare @str varchar(40) = '20161012_1528'
    
    select @dt = 
        DATEADD(MI, CAST(right(@str,2) as int), 
            DATEADD(hh, cast(SUBSTRING(@str,10,2) as int), 
                CONVERT(datetime, left(@str,8))
            )
        )
    select @dt
    

    【讨论】:

      【解决方案3】:

      我能找到的最接近的是日期时间格式 112,它不考虑“_hhmm”。我强烈建议只将转换放入您的 T-SQL,因为优化器不能很好地处理 UDF。

      T-SQL 看起来像: DECLARE @datetimestring nvarchar(max) = '20161012_1528'

      SELECT
          dateadd(
              minute,convert(
                  int,substring(
                      @datetimestring,charindex(
                          '_',@datetimestring
                      )+3,2
                  )
              ),dateadd(
                  hour,convert(
                      int,substring(
                          @datetimestring,charindex(
                              '_',@datetimestring
                          )+1,2
                      )
                  ),convert(
                      datetime, substring(
                          @datetimestring,0,charindex(
                              '_',@datetimestring
                          )
                      ), 112
                  )
              )
          )
      

      另一种选择是将字符串格式化为更短的预期日期格式。

      SELECT
          convert(
              datetime,replace(
                  stuff(
                      stuff(
                          stuff(
                              @datetimestring,5,0,'-'
                          ),8,0,'-'
                      ),14,0,':'
                  ),'_',' '
              )
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 2014-04-23
        • 2015-09-17
        • 1970-01-01
        • 2017-05-05
        • 2013-05-04
        • 2022-08-18
        相关资源
        最近更新 更多