【问题标题】:CONCAT columns without sub-query SQL Server没有子查询 SQL Server 的 CONCAT 列
【发布时间】:2018-08-14 04:07:00
【问题描述】:

我想看看是否有更好的方法来处理这个查询

日期字段的格式为 - 06-03-2018

我需要一个看起来像例如的列3月18日 例如

SELECT
CONCAT(P.[Month] + '-', p.[Year]) AS [Month-Year]
FROM
(
SELECT 
left(datename(MONTH,[Date]),3) AS [Month]
,right(YEAR([Date]),2) AS [Year]
FROM
Table1
)P

这给了我想要的结果,但我想知道是否无论如何都可以在没有子查询的情况下获得相同的结果。谢谢

【问题讨论】:

  • 您不需要子查询或datename 等。您可以使用FORMAT 格式化值,例如日期时间或CONVERT,在旧版本的SQL Server 中带有格式代码。即使您想使用DATENAME,您也可以将所有内容放在一个 SELECT 中
  • select format(getdate(),'MMM-yy') 就够了
  • 顺便说一句,格式化日期的最佳位置是 客户端,而不是查询。 很多在控件或报表的 Format 属性上指定所需的格式、文化(即语言)等更加容易和快捷
  • 在数据库中格式化最快的选项可能是根本不这样做。创建一个日历表,其中包含月份名称、年份或您要在报告中使用的任何格式的额外列。这将允许报告工具按格式化值过滤

标签: sql sql-server tsql subquery concat


【解决方案1】:

您提供的查询无效,您需要在列声明之间使用逗号 (,)(您缺少该逗号。

无论如何,查询可以简化为:

SELECT LEFT(DATENAME(MONTH,[Date]),3) + '-' + RIGHT(YEAR([Date]),2) AS [Month-Year]
FROM Table1;

我没有在这里使用CONCAT,因为没有必要(因为两个值都将是NULL 或有一个值)。

【讨论】:

    【解决方案2】:

    为什么不把日期格式化为

    select format(convert(date, '06-03-2018', 103), 'MMM-yy')
    

    【讨论】:

    • 我觉得我总是不得不提到FORMAT 是一个相当慢的函数。使用单个值或 2 “很好”,但对于大型数据集,我建议避免使用它。
    • @Larnu 调用 datename, year 然后连接不会更快。格式化的正确方法是客户端,而不是服务器
    • 非常有帮助!谢谢:)
    • @PanagiotisKanavos 想打赌吗?我对 2393770 行的回答:CPU time = 2250 ms, elapsed time = 13749 ms.。使用FORMATCPU time = 84453 ms, elapsed time = 94860 ms.。我会说这明显更快。我建议在你发表这样的声明之前做一些测试。 :) 根据经验,FORMAT 是一个糟糕的功能,因为它太慢了。这是个好主意,但需要大量改进。
    • 然而,并不是说正确的格式化方式不在客户端(它是,我同意这一点);只是DATENAMEYear 和连接比使用FORMAT 快得多
    【解决方案3】:

    你可以直接做串联

    SELECT 
        CAST(LEFT(datename(MONTH, [Date]), 3) AS VARCHAR(20))
        +'-'+
        CAST(RIGHT(YEAR([Date]), 2) AS VARCHAR(20))
        FROM Table1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2017-06-03
      • 2021-06-19
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多