【问题标题】:Date format query in CASE expressionCASE 表达式中的日期格式查询
【发布时间】:2018-04-03 16:11:41
【问题描述】:

我正在尝试在以下 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语句里面怎么做,请帮忙。

【问题讨论】:

  • @Stefan 我不太同意,这里的主要问题是逻辑/评估顺序,而不是简单的格式化部分。
  • @Aaron 嗨,无论如何我可以像上面一行中那样包含格式。这个查询还有很多内容,而这只是其中的一小部分?

标签: sql-server-2012 case date-formatting


【解决方案1】:

您可以将整个查询放入子查询中,因此您只需应用一次格式设置。您也可以使用COALESCE,它只是写CASE WHEN IS NOT NULL THEN this ELSE that END 的一种更短的方式。最后,还有用于格式化日期时间值的内置样式选项,可以避免所有混乱的字符串操作(您可以查看 all the options here)。

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;

【讨论】:

    【解决方案2】:

    我使用以下方法让它工作:-

    案例 当 E.A_EXTTRNDTETME 为 NULL 时 (SELECT top 1 LEFT(A_EXTTRNDTETME, 4)+SUBSTRING(A_EXTTRNDTETME, 5, 2)+SUBSTRING(A_EXTTRNDTETME, 7, 2)+'-'+SUBSTRING(A_EXTTRNDTETME, 9, 2)+' :'+SUBSTRING(A_EXTTRNDTETME, 11, 2)+':'+SUBSTRING(A_EXTTRNDTETME, 13,2)+'.'+SUBSTRING(A_EXTTRNDTETME, 15,3) FROM T_ATH_EXE 其中 A_PAREXEID = E.A_EXEID 由 E.A_ADDDTETME 订购) 当 E.A_EXTTRNDTETME 不为 NULL 时 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) ELSE'文本' END 为 [TransactTime],

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      相关资源
      最近更新 更多