Sql server 2012 CASE表达式中的日期格式查询

Sql server 2012 CASE表达式中的日期格式查询,sql-server-2012,case,date-formatting,Sql Server 2012,Case,Date Formatting,我试图在下面的SQL中输出日期格式 CASE WHEN E.A_EXTTRNDTETME IS NOT NULL then LEFT(E.A_EXTTRNDTETME, 4) +SUBSTRING(E.A_EXTTRNDTETME, 5, 2)+SUBSTRING(E.A_EXTTRNDTETME, 7, 2) +'-'+SUBSTRING(E.A_EXTTRNDTETME, 9, 2)+':'+SUBSTRING(E.A_EXTTRNDTETME, 11, 2) +':

我试图在下面的SQL中输出日期格式

CASE
WHEN E.A_EXTTRNDTETME IS NOT NULL then LEFT(E.A_EXTTRNDTETME, 4)
    +SUBSTRING(E.A_EXTTRNDTETME, 5, 2)+SUBSTRING(E.A_EXTTRNDTETME, 7, 2)
    +'-'+SUBSTRING(E.A_EXTTRNDTETME, 9, 2)+':'+SUBSTRING(E.A_EXTTRNDTETME, 11, 2)
    +':'+SUBSTRING(E.A_EXTTRNDTETME, 13,2)+'.'+SUBSTRING(E.A_EXTTRNDTETME, 15,3)
WHEN E.A_EXTTRNDTETME IS NULL then 
(
  SELECT TOP 1 A_EXTTRNDTETME FROM T_ATH_EXE 
  WHERE A_PAREXEID = E.A_EXEID ORDER BY A_ADDDTETME
)
ELSE ' text'
END as [TransactTime], 
第二个WHEN语句返回20180322141422883,但我希望它采用以下格式,就像第一个分支中的值一样:

20180322-14:14:22.883

但是不知道如何在SELECT语句中执行,请提供帮助。

您可以将整个查询放入子查询,因此只需应用一次格式设置。您还可以使用COALESCE,这只是在不为NULL时编写CASE的一种较短的方法,而不是到此为止。最后,还有用于格式化日期时间值的内置样式选项,可以避免您看到的所有混乱的字符串操作


我使用以下方法使其工作:-

案例 当E.A_exttrndtetem为空时,选择前1个LEFTA_exttrndtetem,4+SUBSTRINGA_exttrndtetem,5,2+SUBSTRINGA_exttrndtetem,7,2+'-'+SUBSTRINGA_exttrndtetem,9,2+':'+SUBSTRINGA_exttrndtetem,11,2+'+SUBSTRINGA_exttrndtetem,13,2+'.+SUBSTRINGA_exttrndtetem,15,3 FROM T_EXE,其中axeid=E 当E.A_exttrndteme不为空时,则LEFTE.A_exttrndteme,4+子字符串E.A_exttrndteme,5,2+子字符串E.A_exttrndteme,7,2+'-'+子字符串E.A_exttrndteme,9,2+':'+子字符串E.A_exttrndteme,11,2+':'+子字符串E.A_exttrndteme,13,2+'+子字符串E.A_exttrndteme,15,3 其他“文本”
结束为[Transact-Time],

可能重复@Stefan我不太同意,这里的主要问题是计算的逻辑/顺序,而不是简单的格式设置。@Aaron您好,我是否可以用与上一行相同的方式包含格式设置。这个问题还有很多,而这只是其中的一小部分?
SELECT *, TransactTime = COALESCE
    (
      CONVERT(char(8), dt, 112) + '-' + CONVERT(char(12), dt, 108),
     ' text'
    )
FROM -- your larger query here
(
  SELECT 
    dt = COALESCE
    (
      E.A_EXTTDNDTETME, 
      (
        SELECT TOP (1) A_EXTTRNDTETME 
          FROM T_ATH_EXE 
          WHERE A_PAREXEID = E.A_EXEID 
          ORDER BY A_ADDDTETME
      )
    ), -- other columns... 
  FROM -- table...
) AS sub;