Sql到SSRS的日期格式mm/dd/yyyy hh:mm:ss.nnn AM/PM

Mik*_*ike 1 sql-server reportingservices-2005

我需要获得SSRS的确切日期时间,我注意到当我使用日期字段时,SSRS中的毫秒被切断,所以我在考虑格式化字符串.我找不到与我需要的输出匹配的转换选项

mm/dd/yyyy hh:mm:ss.nnn AM/PM

所以我想出了这个很长的公式

-- Test Data
DECLARE @DATETIMESTAMP DATETIME 
SET @DATETIMESTAMP = GETDATE()
------------
SELECT DISTINCT 
    RIGHT('0'+CONVERT(VARCHAR(2), MONTH(@DateTimeStamp)), 2) + '/' +
    RIGHT('0'+CONVERT(VARCHAR(2), DAY(@DateTimeStamp)), 2) + '/' +
    CONVERT(VARCHAR(4), YEAR(@DateTimeStamp)) + ' ' +
    CASE 
        WHEN DATEPART(HOUR, @DateTimeStamp) > 12 THEN RIGHT('0'+CONVERT(VARCHAR(2), DATEPART(HOUR, @DateTimeStamp)-12), 2)
        WHEN DATEPART(HOUR, @DateTimeStamp) = 0 THEN '12'
        ELSE RIGHT('0'+CONVERT(VARCHAR(2), DATEPART(HOUR, @DateTimeStamp)), 2)
    END + ':' +
    RIGHT('0'+CONVERT(VARCHAR(4), DATEPART(MINUTE, @DateTimeStamp)), 2) + ':' +
    RIGHT('0'+CONVERT(VARCHAR(4), DATEPART(SECOND, @DateTimeStamp)), 2) + '.' +
    RIGHT('000'+CONVERT(VARCHAR(4), DATEPART(MILLISECOND, @DateTimeStamp)), 3) + ' ' +
    CASE 
        WHEN DATEPART(HOUR, @DateTimeStamp) > 11 THEN 'PM'
        ELSE 'AM'
    END 
    ,@DateTimeStamp
Run Code Online (Sandbox Code Playgroud)

有谁能建议更好的方法?

这是报告的图片:这是使用我的代码 在此输入图像描述

如果我只是传回@DATETIMESTAMP我会得到的 11/20/2013 02:23:19 PM

然后运行查询时,没有记录将匹配,因为11/20/2013 02:23:19.000 PM11/20/2013 02:23:19.083 PM

Aar*_*and 5

Geez,这是很多繁忙的工作,应该由SSRS处理.您可以在T-SQL中执行此操作,但在格式化字符串时会产生大量开销,而不仅仅是返回本机数据.这是一种产生11/25/2013 3:03:12.567PM:

SELECT CONVERT(CHAR(11), GETDATE(), 101)
  + LTRIM(RIGHT(CONVERT(CHAR(26), GETDATE(), 9), 14));
Run Code Online (Sandbox Code Playgroud)

如果你真的需要毫秒和上午/下午之间的空间,那么你可以通过更多的工作来实现目标:

SELECT CONVERT(CHAR(11), GETDATE(), 101)
  + LTRIM(STUFF(RIGHT(CONVERT(CHAR(26), GETDATE(), 9), 14),13,0,' '));
Run Code Online (Sandbox Code Playgroud)

如果你真的需要领先0,它会变得更有趣:

SELECT CONVERT(CHAR(11), GETDATE(), 101)
  + RIGHT('0' + LTRIM(STUFF(RIGHT(CONVERT(CHAR(26), GETDATE(), 9), 14),13,0,' ')),15);
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2012中,您将能够说:

SELECT FORMAT(GETDATE(), 'MM/dd/yyyy hh:mm:ss.fff tt');
Run Code Online (Sandbox Code Playgroud)

但同样,这些在SQL Server中格式化字符串的方法会在数据库上强加大量额外的CPU开销,而表示层要更好地处理这些开销 - 无论如何必须独立地处理每一行.通过应用格式化和其他操作,SQL Server只需要在强制执行时将集合视为一堆独立行,这会显着降低查询速度.

没关系,这mm/dd/yyyy是非常不负责任的输出.您确定您的所有观众都会明白06/09/2013是6月9日而不是9月6日吗?