【问题标题】:I want Datetime Parameter in DDMMYYYY Format in ssrs report我想要 ssrs 报告中 DDMMYYYY 格式的日期时间参数
【发布时间】:2015-06-28 18:56:15
【问题描述】:

我想将 Datetime 参数更改为 DDMMYYYY 格式。其默认值为 MMddYYYY。当用户从日期选择器中选择日期时,日期应以 ddmmyyyy 格式显示。 我尝试了所有的表达方式,例如

=Format(Parameters!DateFrom.Value, "dd/MM/yy")
=cdate(format(DateAdd("d", -61, now),"dd/MM/yyyy"))
=cdate(format(DateAdd("d", -61, now),"dd/MM/yyyy"))

但一切都不起作用。

【问题讨论】:

  • 请帮我解决这个问题。客户要求我采用这种格式
  • 我认为您不能指定日期选择器参数的格式。我认为它会自动使用在服务器级别设置的默认格式。
  • 是的,正确的选项卡,但我想以 ddmmyyyy 格式更改默认日期时间参数。
  • 实际上它看起来可以在报告级别完成。尝试本文中的步骤:msdn.microsoft.com/en-us/library/…
  • 感谢选项卡的链接,但我想将它应用于日期时间参数而不是文本框。

标签: reporting-services ssrs-2008 ssrs-2008-r2 ssrs-grouping


【解决方案1】:

你不能。我能想到的最接近的是将报告的语言属性上的表达式设置为=User!Language,这至少会以用户系统日期格式显示。

【讨论】:

  • 感谢 energ1ser,你能告诉我在哪里可以应用这个表达式吗?
  • 请参考我添加的图片。
  • 更改语言后同样的问题仍然存在,日期时间参数中的日期不是 DDMMYYYY 格式。
【解决方案2】:

您甚至不需要将语言设置为 user!Language。 SSRS 将从本地用户区域设置中获取 DateFormat。


但显然您对此没有太多控制权,如果您的客户急需这种格式,他们的 PC 可能没有设置这些设置?

祝你好运!

以下报告的语言设置为 en-au(即 dd/mm/yyyy)

【讨论】:

  • 感谢 Trubs 的回复,但这个 1 不起作用,我按照您的步骤操作,但仍然存在同样的问题。
  • @trubs:你会告诉每个用户这样做,并告诉管理员给用户这个权利。哈哈。这样的回答会严重影响你的精神状态。
【解决方案3】:

死灵法。
是的,你可以 - 有点。
首先,请注意 SSRS 采用浏览器中指定语言的日期格式。

所以你可以改变浏览器的语言。 显然,您不想告诉您的用户这样做。

因此,您将一个附加参数传递到您的报告中:
我称它为 in_sprache(Sprache 在德语中的意思是语言,可能的值是“DE”、“FR”、“IT”、“EN”)。

现在您需要通过覆盖 ReportViewer.aspx 中的虚拟方法“InitializeCulture”来更改本地化过程。

您可以在

中找到ReportViewer
C:\Program Files\Microsoft SQL Server\MSRS<Version>.MSSQLSERVER
C:\Program Files\Microsoft SQL Server\MSRS<Version>.<Instance>

例如

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER

您在此处添加(在 /ReportServer/Pages/ReportViewer.aspx 的源代码中):

<script type="text/C#" runat="server">

protected override void InitializeCulture()
{
    string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"];

    if(string.IsNullOrEmpty(sprache))
        sprache = "";

    switch(sprache.ToLowerInvariant())
    {
        case "de":
            sprache = "de-CH";
            break;
        case "fr":
            sprache = "fr-CH";
            break;
        case "it":
            sprache = "it-CH";
            break;
        case "en":
            sprache = "en-US";
            break;
        default:
            sprache = "";
            break;
    }

    // System.Web.HttpContext.Current.Response.Write(sprache);
    if(!String.IsNullOrEmpty(sprache))
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache);
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache);
    }

    base.InitializeCulture();
}

</script>

这将使用 url 参数 in_sprache 中指定的语言覆盖浏览器用户语言(in_sprache 必须是您报告的参数)。

现在,您还必须覆盖 context.request.userLanguages 才能使日期选择器正常工作...您只能通过将 HTTP 模块 (libRequestLanguageChanger.dll) 添加到 ReportServer 的 web.config 中来做到这一点

  <system.web>
    [...]
    <httpModules>
      [...]
      <add name="RequestLanguageChanger" type="libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" />

    </httpModules>
    [...]
  </system.web>

。 (需要将信任级别从 rosetta 更改为“Full”,除非您知道如何更改 rosetta-policy 以允许此 http 模块)。

由于我们还可以在 HTTP-Module 中覆盖 InitializeCulture,因此您实际上不必将 runat="server" 脚本添加到 ReportViewer.aspx。

namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


        void System.Web.IHttpModule.Dispose()
        {
            // throw new NotImplementedException();
        }


        void System.Web.IHttpModule.Init(System.Web.HttpApplication context)
        {
            // https://stackoverflow.com/questions/441421/httpmodule-event-execution-order
            context.BeginRequest += new System.EventHandler(context_BeginRequest);
        }


        void context_BeginRequest(object sender, System.EventArgs e)
        {
            System.Web.HttpApplication application = sender as System.Web.HttpApplication;
            System.Web.HttpContext context = application.Context;

            if (context.Request != null)
            {
                // string language = context.Request.Headers["Accept-Language"];
                string language = null;
                // string url = context.Request.RawUrl;
                // string referrer = null;


                if (context.Request.UrlReferrer != null)
                {
                    // referrer = context.Request.UrlReferrer.OriginalString;

                    string queryString = context.Request.UrlReferrer.Query;
                    System.Collections.Specialized.NameValueCollection queryStrings = System.Web.HttpUtility.ParseQueryString(queryString);
                    language = queryStrings["in_sprache"];
                }

                if(context.Request.QueryString["in_sprache"] != null)
                    language = context.Request.QueryString["in_sprache"];

                if (!string.IsNullOrEmpty(language))
                {
                    language = language.ToLowerInvariant();

                    switch (language)
                    {
                        case "de":
                            language = "de-CH";
                            break;
                        case "fr":
                            language = "fr-CH";
                            break;
                        case "it":
                            language = "it-CH";
                            break;
                        case "en":
                            language = "en-US";
                            break;
                        default:
                            language = "";
                            break;
                    }

                } // End if (!string.IsNullOrEmpty(sprache)) 

                // SQL.Log(url, referrer, sprache);


                // Simulate Browser-Language = in_sprache 
                if (!string.IsNullOrEmpty(language))
                {
                    // context.Request.Headers["Accept-Language"] = language;

                    System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(language);
                    System.Threading.Thread.CurrentThread.CurrentCulture = culture;
                    System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

                    if (context.Request.UserLanguages != null)
                    {

                        // System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(context.Request.UserLanguages[0]); 
                        for (int i = 0; i < context.Request.UserLanguages.Length; ++i)
                        {
                            // context.Request.UserLanguages[i] = "en-US";
                            context.Request.UserLanguages[i] = language;
                        } // Next i 

                    } // End if (context.Request.UserLanguages != null)

                } // End if (!string.IsNullOrEmpty(language)) 

            } // End if (context.Request != null) 


        } // End Sub context_BeginRequest 


    } // End Class 


} // End Namespace 

你就是这样,具有“自定义”文化日期格式的 ReportServer,无需告诉用户更改浏览器语言。

【讨论】:

  • 这太棒了!提醒我,我最终为 SSRS 编写了一个完整的自定义前端以获得更多控制。见stackoverflow.com/a/6779738/22194
  • @StefanSteiger 您是否能够记住,您为找出此解决方案采取了哪些步骤?我正在尝试为 PowerBI 报告找出一个等效的解决方案(它们也托管在 SSRS 中,但似乎忽略了语言标题)。
  • @user5226582:首先,我认为它适用于 JavaScript 的 navigator.language/systemLanguage。所以我改变了那些,但这没有用。然后我覆盖了aspx中的文化。这适用于下拉框的文本。然后我注意到它不适用于日期选择器。所以我认为它必须是一个处理程序,并使用 HTTP 标头 - 覆盖它的唯一方法是创建一个 http 模块。所以我用http模块覆盖了标题。那没有用。所以我认为它必须在更改标头之前创建 request.language ,并改为更改 request.language 。令人惊讶的是,这奏效了。
  • @user5226582:也许 PowerBI 采用 JavaScript 值(navigator.language 和 navigator.systemLanguage)。也许你必须覆盖这些。
  • @StefanSteiger 太棒了,感谢您的回复!
【解决方案4】:

根据 Trubs 的建议,我在浏览器(这次是 Chrome)中设置了语言,并正确格式化了值。我将语言从使用 mm/dd/yy 格式的英语(美国)更改为使用 dd/mm/yy 格式的英语(澳大利亚)。当然,我们不可能让每个用户都更改他们的浏览器设置,但 DevOps 可以而且肯定应该将他们组织中所有浏览器的语言设置为他们所在国家/地区的正确语言?

【讨论】:

    【解决方案5】:
    =Format(CDate(Parameters!DateFrom.Value), "yyyy-MM-dd HH:mm:ss")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多