2012-04-27 95 views
1

的日期/时间,我有一个日期时间字段在SQL Server中有这样的价值2005表:格式化SQL Server 2005中

2012-04-23 09:00:00.000 
2012-04-23 14:00:00.000 

的分,秒,和毫秒始终为零。

我需要显示这样的“时间段”(基本上,时间加一小时):我需要用这个

2012/04/23 09:00 AM - 10:00 AM 
2012/04/23 02:00 PM - 03:00 PM 

我:

SELECT SUBSTRING(CONVERT(VARCHAR, TimeSlot, 20), 1, 10) + ' ' + 
     RIGHT('00000' + LTRIM(SUBSTRING(CONVERT(VARCHAR(24), TimeSlot, 109), 13, 5)), 5) + ' ' + 
     SUBSTRING(CONVERT(VARCHAR(19), TimeSlot, 100),18,2) + ' - ' + 
     RIGHT('00000' + LTRIM(SUBSTRING(CONVERT(VARCHAR(24), DATEADD(hh, 1, TimeSlot), 109), 13, 5)), 5) + ' ' + 
     SUBSTRING(CONVERT(VARCHAR(19), DATEADD(hh, 1, TimeSlot), 100), 18, 2) AS TimeSlot 
FROM MyTable 

它的工作原理,但我觉得很肮脏。

我知道我能做到这一点的代码(VB .NET)更容易,但假设我必须这样做,在SQL。

有没有清洁的方式做到这一点?

回答

1

以内置conversions,我会用这样的:

SELECT 
    convert(varchar, [TimeSlot], 111) + ' ' + 
    RIGHT(convert(varchar, [TimeSlot], 0), 7) + ' - ' + 
    RIGHT(convert(varchar, dateadd(hour, 1, [TimeSlot]), 0), 7) 
FROM 
    [MyTable]; 

这给你你想要的行

2012/04/23 9:00AM - 10:00AM 

详细:

  • convert(varchar, @dt, 111)datetime转换为日本格式yy/mm/dd
  • convert(varchar, @dt, 0)转换datetimeApr 23 2012 9:00AM所以我们可以用一部分时间
  • dateadd(hour, 1, @dt)增加1小时当前datetime

你可以测试它不与表:

DECLARE @dt DATETIME 
SET @dt = '2012-04-23 09:00:00' 

PRINT convert(varchar, @dt, 111) + ' ' + 
     RIGHT(convert(varchar, @dt, 0), 7) + ' - ' + 
     RIGHT(convert(varchar, dateadd(hour, 1, @dt), 0), 7); 
+0

谢谢...您的解决方案几乎让我有,但更重要的是确认没有真正优雅的方式来做到这一点。 – aphoria 2012-04-27 19:57:56

+0

通常你只是通过日期,然后它是你的客户端/服务器端处理它,让你更好地控制输出,并有一个功能或过程,可以在你的应用程序的其他领域重用... – balexandre 2012-04-28 07:09:44

+0

我同意。我应该澄清,在SQL中没有一种真正优雅的方式来实现这一点。 – aphoria 2012-04-28 14:29:06

1

的在SQL Server中构建日期/时间格式将只格式化为实际日期格式,因此无论如何您都可以使用自定义格式。如果您使用这种方式提供SSRS,那么您可以使用表达式在SSRS中对其进行格式化。否则,您可以使用类似于您所描述的技术的查询格式化查询。

如果你实际上是用VB应用程序显示它,那么你可以做客户端。

如果您的日期/时间值始终在小时或某种一致的间隔也可以使键上的时间与存储为VARCHAR列格式化的间隔参照表并使用它。这将节省您将格式化表达式插入到生成区间描述所需的每个查询中。

0

FollowingConcernedOfTunbridgeW的建议是,如果您维护一个两列表,其中主键int column [hr]从0到23,char(20)列[rng]包含每个小时的以空格为前缀的范围字符串

' 12:00 AM - 01:00 AM' (in the row where hr = 0) 
... 

' 11:00 PM - 12:00 AM' (in the row where hr = 23) 

这只是查询应产生你想要什么:

select 
    convert(char(10),TimeSlot, 111) + rng as TimeRange 
    from T join RangesByHr 
    on datepart(hour,TimeSlot) = hr; 
+0

感谢您的建议。我将在星期一进行实验。 – aphoria 2012-04-28 02:25:08