【问题标题】:Formatting Datetime Column格式化日期时间列
【发布时间】:2011-11-20 14:31:19
【问题描述】:

我有一个名为 FcData 的表,数据如下所示:

Op_Date  

2011-02-14 11:53:40.000 
2011-02-17 16:02:19.000 
2010-02-14 12:53:40.000 
2010-02-17 14:02:19.000 

我希望 mm/yyyy 格式的输出示例输出应该是:

Op_Date

02/2011
02/2011
02/2010
02/2010

我写了这样的查询:

SELECT CONVERT(VARCHAR,DATEPART(mm,Op_Date
)) + '/' + CONVERT(VARCHAR,DATEPART(yyyy,Op_Date))
 FROM Fcdata

但我得到的输出是:

Op_Date

2/2011
2/2011
2/2010
2/2010

谁能帮帮我?

【问题讨论】:

标签: sql-server sql-server-2005 tsql sql-server-2008 datetime


【解决方案1】:

我认为这是您能找到的最短的代码,并且只需要一次转换:

SELECT RIGHT(CONVERT(CHAR(10), Op_Date, 103), 7);

将其映射到您的查询:

SELECT Op_Date, RIGHT(CONVERT(CHAR(10), Op_Date, 103), 7)
    FROM dbo.Fcdata;

连接将是:

SELECT f.*, o.*
    FROM dbo.Fcdata AS f
    INNER JOIN dbo.OtherTable AS o
    ON RIGHT(CONVERT(CHAR(10), f.Op_Date, 103), 7) = o.column_name;

如果表很大,不要指望性能会很快,因为转换会强制 SQL Server 扫描每一行。

另外请不要使用像 yyyy 和 mm 这样的简写。你知道y和yyyy不一样吗?现在有五种不同的以 m 开头的速记(m,mi,ms,mm,mcs)?拼出来。如果您的意思是年份,请说年份。那么大家就清楚了。

【讨论】:

  • @Aaron Bertrand 非常感谢!
【解决方案2】:
SELECT 
  CASE WHEN LEN(CONVERT(VARCHAR,DATEPART(mm,Op_Date)) = 1 THEN
    '0' + CONVERT(VARCHAR,DATEPART(mm,Op_Date)) + '/' + CONVERT(VARCHAR,DATEPART(yyyy,Op_Date))
  ELSE
    CONVERT(VARCHAR,DATEPART(mm,Op_Date)) + '/' + CONVERT(VARCHAR,DATEPART(yyyy,Op_Date))
  END
FROM Fcdata

【讨论】:

  • 5 次转换?当您总是可以附加 0 并取右时,这样做似乎很浪费。那么至少你只有 2 位转换者。
  • LOL..yes 正在查看您的解决方案,并且肯定“向您致敬”。您的解决方案要优雅得多。 :)
【解决方案3】:
SELECT RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(MM, Op_Date)), 2) + '/' + CONVERT(VARCHAR,DATEPART(yyyy,Op_Date))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多