【问题标题】:Convert any datetime format to yyyy-mm-dd hh:mm:ss.sss将任何日期时间格式转换为 yyyy-mm-dd hh:mm:ss.sss
【发布时间】:2019-12-04 07:53:17
【问题描述】:

我有如下两种不同格式的日期如下图:

DECLARE @A VARCHAR(50) = '2019-11-06 00:00:00'
DECLARE @A1 VARCHAR(50) = '06-11-2019 00:00:00'

我需要编写一个单个转换语句,将上述任何格式转换为yyyy-mm-dd hh:mm:ss.sss

试过了:

SELECT CONVERT(DATETIME,@A) AS A, CONVERT(DATETIME,@A1) AS A1   

获取:

A                           A1
---------------------------------------------------------
2019-11-06 00:00:00.000     2019-06-11 00:00:00.000

预期:

A                           A1
---------------------------------------------------------
2019-11-06 00:00:00.000     2019-11-06 00:00:00.000 

我不想写两个不同的转换语句,因为我不知道哪个输入日期是哪种格式。

【问题讨论】:

  • A DATETIME 没有格式。你所拥有的是一个格式化的字符串而不是DATETIME
  • 那么,引擎应该知道哪个变体是正确的?如果这些是参数,请确保在调用例程时传递相同的格式。如果这是旧数据 - 创建日期时间列并自行修复数据。

标签: sql sql-server date datetime


【解决方案1】:

使用 case 检查您是否具有第一种或第二种格式,然后调用 convert 函数提供它们的确切格式(dd-mm-yyy 为 105,yyyy-mm-dd 为 120)。

https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15

select case when substring(@A, 3, 1) = '-' then convert(datetime, @A, 105) 
            else convert(datetime, @A, 120) 
       end

【讨论】:

    【解决方案2】:

    你可以试试这个:

    SELECT FORMAT(CONVERT(DATETIME,@A), 'yyyy-mm-dd hh:mm:ss.sss')
    

    【讨论】:

    • 注意日期中的“mm”可能应该是“MM”。小写是分钟 大写是月份
    【解决方案3】:

    您可以检查日期格式。然后应用所需的转换。

    DECLARE @A VARCHAR(50) = '2019-11-06 00:00:00'
    DECLARE @A1 VARCHAR(50) = '06-11-2019 00:00:00'
    
    
    select case when convert(varchar, @A, 105) = @A then convert(datetime, @A, 120)  else convert(datetime, @A, 120)  end;
    select case when convert(varchar, @A1, 105) = @A1 then convert(datetime, @A1, 105)  else convert(datetime, @A1, 105)  end;
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2019-08-09
      • 2022-10-13
      • 2019-08-25
      • 1970-01-01
      • 2017-08-21
      • 2013-10-19
      • 2017-06-24
      • 1970-01-01
      相关资源
      最近更新 更多