Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 如何在sql server中显示时间间隔_Sql Server - Fatal编程技术网

Sql server 如何在sql server中显示时间间隔

Sql server 如何在sql server中显示时间间隔,sql-server,Sql Server,我有两个变量,存储时间范围。 我必须以这种格式显示时间间隔 09:00:00 -- 09:30:00 09:30:00 -- 10:00:00 10:00:00 -- 10:30:00 10:30:00 -- 11:00:00 UpTO 05:00:00 -- 05:30:00 这是我的密码 无论如何,我的代码是工作,但寻找建议,以实现它的任何其他最好的方式 我的工作完成了。完整的sql语句如下 当您的代码在这里工作时,还有一种方法可以创建如下cte: DECLARE @Start

我有两个变量,存储时间范围。 我必须以这种格式显示时间间隔

09:00:00  -- 09:30:00
09:30:00  -- 10:00:00
10:00:00  -- 10:30:00
10:30:00  -- 11:00:00

UpTO

05:00:00 -- 05:30:00
这是我的密码 无论如何,我的代码是工作,但寻找建议,以实现它的任何其他最好的方式

我的工作完成了。完整的sql语句如下
当您的代码在这里工作时,还有一种方法可以创建如下cte:

DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH interval_cte(StartTime, EndTime) AS
(
   SELECT @StartTime StartTime, DATEADD(mi, 30, @StartTime) EndTime

   UNION ALL

   SELECT EndTime, DATEADD(mi, 30, EndTime)  FROM interval_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM interval_cte
DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH time_cte(StartTime, EndTime) AS
(
   SELECT CONVERT(varchar,@StartTime,108) StartTime, CONVERT(varchar,(DATEADD(mi, 30, @StartTime)),108) EndTime

   UNION ALL

   SELECT CONVERT(varchar,EndTime,108), CONVERT(varchar,(DATEADD(mi, 30, EndTime)),108)  FROM time_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM time_cte
要仅获取时间间隔,即不包含日期部分,请尝试以下操作:

DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH interval_cte(StartTime, EndTime) AS
(
   SELECT @StartTime StartTime, DATEADD(mi, 30, @StartTime) EndTime

   UNION ALL

   SELECT EndTime, DATEADD(mi, 30, EndTime)  FROM interval_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM interval_cte
DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH time_cte(StartTime, EndTime) AS
(
   SELECT CONVERT(varchar,@StartTime,108) StartTime, CONVERT(varchar,(DATEADD(mi, 30, @StartTime)),108) EndTime

   UNION ALL

   SELECT CONVERT(varchar,EndTime,108), CONVERT(varchar,(DATEADD(mi, 30, EndTime)),108)  FROM time_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM time_cte

当您的代码在这里工作时,还有一种方法可以创建如下cte:

DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH interval_cte(StartTime, EndTime) AS
(
   SELECT @StartTime StartTime, DATEADD(mi, 30, @StartTime) EndTime

   UNION ALL

   SELECT EndTime, DATEADD(mi, 30, EndTime)  FROM interval_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM interval_cte
DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH time_cte(StartTime, EndTime) AS
(
   SELECT CONVERT(varchar,@StartTime,108) StartTime, CONVERT(varchar,(DATEADD(mi, 30, @StartTime)),108) EndTime

   UNION ALL

   SELECT CONVERT(varchar,EndTime,108), CONVERT(varchar,(DATEADD(mi, 30, EndTime)),108)  FROM time_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM time_cte
要仅获取时间间隔,即不包含日期部分,请尝试以下操作:

DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH interval_cte(StartTime, EndTime) AS
(
   SELECT @StartTime StartTime, DATEADD(mi, 30, @StartTime) EndTime

   UNION ALL

   SELECT EndTime, DATEADD(mi, 30, EndTime)  FROM interval_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM interval_cte
DECLARE @StartTime DATETIME, @EndTime DATETIME

SELECT @StartTime = '09:00:00'
SELECT @EndTime = '17:30:00'


;WITH time_cte(StartTime, EndTime) AS
(
   SELECT CONVERT(varchar,@StartTime,108) StartTime, CONVERT(varchar,(DATEADD(mi, 30, @StartTime)),108) EndTime

   UNION ALL

   SELECT CONVERT(varchar,EndTime,108), CONVERT(varchar,(DATEADD(mi, 30, EndTime)),108)  FROM time_cte
   WHERE EndTime < @EndTime

)  
SELECT * FROM time_cte

如果您只是询问将9:30AM 10:00AM转换为09:00:00-10:00:00的格式,则只需将打印行更改为以下格式:

PRINT CONVERT(varchar,@StartTime,108)+ ' -- '+CONVERT(varchar,@InvTime,108)

如果您只是询问将9:30AM 10:00AM转换为09:00:00-10:00:00的格式,则只需将打印行更改为以下格式:

PRINT CONVERT(varchar,@StartTime,108)+ ' -- '+CONVERT(varchar,@InvTime,108)

一切都很好,但你的代码日期也显示出来了。我只需要打印hh;mm:ss。您需要在代码中使用这个CONVERTvarchar,@StartTime,108来只返回hh:mm:ss。@Thomas:-的确,这会给您想要的@托马斯:-更新了我的答案!这是生成序列的CTE的一个很好的示例。加上我的$0.02;在最终的SELECT*中进行转换更简洁,CPU效率更高,因此递归CTE仅使用日期时间而不是字符串表示。一切正常,但代码日期也显示出来。我只需要打印hh;mm:ss。您需要在代码中使用这个CONVERTvarchar,@StartTime,108来只返回hh:mm:ss。@Thomas:-的确,这会给您想要的@托马斯:-更新了我的答案!这是生成序列的CTE的一个很好的示例。加上我的$0.02;在最终的SELECT*中进行转换更简洁,CPU效率更高,因此递归CTE仅使用日期时间而不是字符串表示。