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