1

我在 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 中做到这一点。

有没有更清洁的方法来做到这一点?

4

3 回答 3

1

采用内置的转换,我会使用这样的东西:

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)在当前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);
于 2012-04-27T15:48:11.763 回答
1

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

如果您实际上是使用 VB 应用程序显示它,那么您可以在客户端执行该操作。

如果您的日期/时间值始终是小时或某个一致的时间间隔,您还可以制作一个以时间为键的参考表,并将格式化的时间间隔存储为 varchar 列并使用它。这将节省您将格式化表达式内联到需要生成间隔描述的每个查询中。

于 2012-04-27T15:57:34.130 回答
0

遵循ConcernedOfTunbridgeW 的建议,如果您维护一个包含主键 int 列 [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;
于 2012-04-28T01:33:25.190 回答