我需要获得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
有人能建议更好的方法吗?
以下是报告的图片:这是使用我的代码
如果我只是传回@DATETIMESTAMP,我会得到的
11/20/2013 02:23:19 PM
然后在运行查询时,没有记录匹配,因为11/20/2013 02:23:19.000 PM
到11/20/2013 02:23:19.083 PM
答案 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