格式化日期时间列

时间:2011-09-19 21:23:19

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

我有一个名为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

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:4)

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

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)开头?拼写出来。如果你的意思是YEAR,那就说YEAR。然后每个人都清楚。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

SELECT RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(MM, Op_Date)), 2) + '/' + CONVERT(VARCHAR,DATEPART(yyyy,Op_Date))