Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2005中格式化日期/时间_Sql_Vb.net_Sql Server 2005_Datetime - Fatal编程技术网

在SQL Server 2005中格式化日期/时间

在SQL Server 2005中格式化日期/时间,sql,vb.net,sql-server-2005,datetime,Sql,Vb.net,Sql Server 2005,Datetime,我在SQL Server 2005表中有一个datetime字段,其值如下: 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 convert(varchar, [TimeSlot], 111) + ' ' + RIGHT(convert(varchar, [TimeSlot], 0),

我在SQL Server 2005表中有一个datetime字段,其值如下:

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 
    convert(varchar, [TimeSlot], 111) + ' ' +
    RIGHT(convert(varchar, [TimeSlot], 0), 7) + ' - ' +
    RIGHT(convert(varchar, dateadd(hour, 1, [TimeSlot]), 0), 7)
FROM
    [MyTable];
分钟、秒和微秒始终为零

我需要显示一个“时间段”(基本上是时间加一小时),如下所示:

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 
    convert(varchar, [TimeSlot], 111) + ' ' +
    RIGHT(convert(varchar, [TimeSlot], 0), 7) + ' - ' +
    RIGHT(convert(varchar, dateadd(hour, 1, [TimeSlot]), 0), 7)
FROM
    [MyTable];
我用这个得到了我所需要的:

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中做

有什么更干净的方法可以做到这一点吗?

对于内置的,我会使用以下方法:

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 
    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)
    日期时间
    转换为
    2012年4月23日上午9:00
    ,因此我们可以使用时间部分
  • 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);

SQL Server中内置的日期/时间格式将只格式化为实际的日期格式,因此您仍然需要自定义格式。如果您正在向SSR提供这个,那么您可能可以使用表达式在SSR中格式化它。否则,您将使用类似于您描述的技术的查询格式化它

如果你真的用VB应用程序来显示它,那么你可以在客户端完成


如果您的日期/时间值总是以小时或某个一致的时间间隔为单位,那么您还可以创建一个参考表,将格式化的时间间隔存储为varchar列,并使用它。这将节省您在生成间隔描述所需的每个查询中排列格式表达式的时间。

如果您维护一个两列表,其中主键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;

谢谢…你的解决方案几乎让我达到了目的,但更重要的是,它证实了没有一种真正优雅的方法来做到这一点。通常你只是传递日期,然后是你的客户机/服务器端来处理它,让你更好地控制输出,并且有一个可以在你的应用程序的其他区域重用的功能或过程…我同意。我应该澄清一下,在SQL中没有一种真正优雅的方法可以做到这一点。谢谢你的建议。我将在星期一做实验。