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

时间:2013-11-25 19:36:34

标签: 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

有人能建议更好的方法吗?

以下是报告的图片:这是使用我的代码 enter image description here

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

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

3 个答案:

答案 0 :(得分: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));

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

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

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

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

在SQL Server 2012中,您可以说:

SELECT FORMAT(GETDATE(), 'MM/dd/yyyy hh:mm:ss.fff tt');

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

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

答案 1 :(得分:1)

在SSRS中使用以下格式:

MM/dd/yyyy hh:mm:ss.fff tt

返回:

11/25/2013 11:41:51.067 AM

将数据类型保留为源查询中的DATETIME。您不需要将输出转换为字符串。使用应用程序层(在本例中为SSRS)来控制格式。

答案 2 :(得分:-1)

DECLARE @Date DATETIME;
SET  @Date  = GETDATE()

SELECT CONVERT(VARCHAR(10), @Date, 101) + ' '
            +  RIGHT(CONVERT(VARCHAR(26), @Date, 109), 14)

<强>结果

11/25/2013 7:44:23:330PM