Sql server 如何将TSQL中的日期列转换为仅显示月份和年份

Sql server 如何将TSQL中的日期列转换为仅显示月份和年份,sql-server,tsql,date,Sql Server,Tsql,Date,我有一个名为DateId的列,它是一个int,并将日期显示为20190626。我可以使用下面的查询将其转换为日期,但我只想将其显示为月份和年份 我有三列DateId、Customer和payamunt,都来自同一个表。有很多客户每个月都要支付多次款项,我希望每月对每个客户进行分组,合并每个客户每个月的所有付款 Select Convert(Date, Convert(Char(8), DateId), 112) As [Date], Sum(PayAmount), Custo

我有一个名为
DateId
的列,它是一个
int
,并将日期显示为
20190626
。我可以使用下面的查询将其转换为日期,但我只想将其显示为月份和年份

我有三列
DateId
Customer
payamunt
,都来自同一个表。有很多客户每个月都要支付多次款项,我希望每月对每个客户进行分组,合并每个客户每个月的所有付款

Select 
    Convert(Date, Convert(Char(8), DateId), 112) As [Date], 
    Sum(PayAmount), Customer 
from 
    Pay 
Group By 
    Customer, DateId
我得到的是:

DateId         PayAmount     Customer
--------------------------------------
2019-06-20       $100           A
2019-06-24       $200           B
2019-04-22       $100           B
2019-03-20       $300           A
2019-04-22       $100           B
2019-06-21       $200           A
2019-06-21       $100           B
我想要的是:

DateId         PayAmount     Customer
-------------------------------------
2019-06         $300           A
2019-06         $300           B
2019-04         $200           B
2019-03         $300           A

您似乎只需要ISO8601样式的前7个字符:

CONVERT(varchar(7),DateId,126)
如果要保留
日期
数据类型,则需要将日期“舍入”到月初。执行此操作的一种常见方法是使用以下方法获取值和日期“0”之间的月差(
1900-01-01
):

如果需要显示格式
yyyy-MM
,可以将其设置为演示层中的格式


如果您也需要按此分组,则将该表达式添加到
group by
子句中。

另一个选项是使用隐式转换。在本例中,
LEFT(DateID,7)

为INT更新的示例

Select DateID      = stuff(left(DateID,6),5,0,'-')
      ,[PayAmount] = sum([PayAmount])
      ,Customer
 From  YourTable
 Group By left(DateID,6),Customer
返回

DateID   PayAmount      Customer
2019-03  300            A
2019-06  300            A
2019-04  200            B
2019-06  300            B

CAST(YEAR(DATEID)为varchar(4))+'-'+left('0'+CAST(MONTH(DATEID)为varchar(2)),2)@PeterSmith的格式实际上会改变基础值以便对其进行分组吗?@PeterSmith虽然存在
格式
,但它是一个执行速度非常慢的函数,最好避免。数据库不是格式化内容的地方。在表示层中执行此操作。我使用的是Power Bi directquery,因此我需要在SQL Side中格式化此部分。我尝试了您的示例,但它返回的DateId为just,int应添加Convert(DATE,Convert(CHAR(8),DateId),112)将此查询作为well@user11681655DateID的数据类型是否为Date?是的,在表示层中,我需要将此列转换为Dateformat@user11681655我不明白这怎么可能,除非DateID不是日期,看一看好的,我明白你的意思,DateID最初是(yyyymmdd)格式的int。我是否可以将Dateid转换为日期类型,然后像您刚才发布的查询那样按月份对日期进行分组?谢谢你的帮助
DateID   PayAmount      Customer
2019-03  300            A
2019-06  300            A
2019-04  200            B
2019-06  300            B