SSRS转换日期并按组分组

3
我有一个名为CreatedDate的DateTime类型列在我的SQL表中,我使用SSRS 2008创建了一份报告。
我已经按照CreatedDate进行了分组。
我需要以dd/MM/yyyy格式对此CreatedDate进行排序。
如果我将此列值转换为Convert(varchar(10),CreateDate,101),那么我将得到MM/dd/yyyy格式的值,并且它正确地对数据进行排序。
03/03/2012
03/05/2012
05/03/2012

如果我将列转换为 Convert(varchar(10),CreatedDate,103),那么我得到的值将以dd/MM/yyyy格式显示,并且排序如下:
03/03/2012
04/05/2012
05/03/2012

但我需要像分组表一样对表进行分组

03/03/2012
05/03/2012
04/05/2012

就像这样,为了做到这一点,我尝试手动在tablix中提供排序功能。

=Format(Fields!CreatedDate.value,"dd/MM/yyyy")

但它不起作用,我该怎么修复它...有人可以在这里帮助我吗...
我在这里使用的查询是:
SELECT ItemName
       , COUNT(ItemName) AS Quantity
       , SUM(LineTotal) AS Amount
       , CONVERT(varchar(10), CreatedDate, 103) AS CreatedDate
FROM StudentFeesItems
WHERE (CONVERT(varchar(10), CreatedDate, 101) BETWEEN @StartDate AND @EndDate)
GROUP BY ItemName, CreatedDate
3个回答

2

您可以在数据集中添加这两种格式的日期,然后按其中一种进行排序:

SELECT [YourColumns], Convert(varchar(8),CreateDate,112) SortDate,
       Convert(varchar(10),CreatedDate,103) Displaydate
FROM YourTable

这样,您就可以在标签页上使用DisplayDate并通过SortDate手动排序。


很好的想法,我尝试过了但仍然得到相同的顺序(不正确)。 - shanish
@Shanish - 我已经将 convert 更改为 SortDate,请再试一次并告诉我是否有帮助。 - Lamak
感谢Lamak的回复,但是它还是不起作用,我仍然得到了错误的顺序。 - shanish
@Shanish - 你确定你在表格或分组上正确配置了排序属性吗? - Lamak
我确信我已经正确地配置了它,不过还是会再检查一遍。 - shanish

2

不要将日期转换为字符串。保持它们为日期并按日期排序。

正如您已经体验到的那样,除非您将字符串格式化为YYYY-MM-DD,否则您将无法获得所需的顺序。如果您将日期保留为DATETIME数据类型,则可以通过它进行排序、分组、格式化和其他操作。

DATEADD(DAY, DATEDIFF(DAY, 0, CreateDate), 0) AS roundedDate


重新编辑

以下是我对你的查询的建议...

WITH
  main_query
AS
(
  SELECT
    ItemName,
    DATEADD(DAY, DATEDIFF(DAY, 0, CreatedDate), 0) AS CreatedDate,
    COUNT(ItemName) AS Quantity,
    SUM(LineTotal) AS Amount
  FROM
    StudentFeesItems
  WHERE
        CreatedDate >= @StartDate
    AND CreatedDate <  DATEADD(DAY, 1, @EndDate)
  GROUP BY
    ItemName,
    DATEADD(DAY, DATEDIFF(DAY, 0, CreatedDate), 0)
)
SELECT
  ItemName,
  Convert(varchar(10), CreatedDate, 103)    AS formattedDate,
  Quantity,
  Amount
FROM
  main_query
ORDER BY
  ItemName,
  CreatedDate

注意:
- 不要在筛选之前调用字段上的函数
- 不要使用字符串操作来将日期时间舍入到日期
- 不要按日期的字符串表示进行排序


但我需要以dd/MM/yyyy的格式显示日期,这就是我尝试做的事情,如果以MM/dd/yyyy的格式排序,它将完美地排序。 - shanish
@Shanish - 只有所有日期都在同一年才行。你能否包含你的代码,这样我们可以直接评论它?同时,我已经在答案中添加了一个通用示例。 - MatBailie
谢谢您的回复Dems,请检查我的更新问题。 - shanish

2

您觉得在您的SQL查询中添加ROW_NUMBER() over (order by CreatedDate) as myOrder并按照myOrder排序如何?

编辑:

=Format(Fields!date.Value,"dd/MM/yyyy")

我尝试在我的查询中使用order by子句,由于我在表的group by中使用了CreatedDate,它无法正常工作,它按照自己的顺序排序。 - shanish
你没明白。如果日期在你的分组中,为什么不能按它排序? - Diego
当然可以按照它排序,如果它的格式是“MM/dd/yyyy”,那么它会正确显示,但我想要的是“dd/MM/yyyy”。 - shanish
我得到的顺序与我在问题中提到的顺序相同(即我的第一个示例)。 - shanish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接