2017-10-09 41 views
-2
DECLARE @Hours AS INT 
DECLARE @SubtractDate AS DATETIME 

SET @Hours=24 /* User input to have hours */ 
SET @SubtractDate=DATEADD(hh,@Hours,GETDATE()) - GETDATE() 

if @Hours>=24 


SELECT CONVERT(VARCHAR(10),DATEDIFF(DAY,'1900-01-01',@SubtractDate))+ ' Day(s) ' + 
CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate))+ ' Hour(s) 'AS [Result] 

Else 
SELECT CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate))+ ' Hour(s) ' AS [Result] 

编辑:复制粘贴从评论。输入为24小时或48小时时如何不能看到小时数的0值

当输入:

SET @Hours=24 /* User input to have hours/

所需的结果将是:1 Day相反,它示出了:1 Day(s) 0 Hour(s)

另外:当输入:

SET @Hours=48/User input to have hours */ 

所需的结果将是:2 Days代替,它显示:2 Day(s) 0 Hour(s)

+3

(1)编辑你的问题,并提供样本数据,预期的效果,和你想要什么解释。 (2)确定你正在使用的数据库。该代码不是MySQl代码。 –

+1

....这段代码最可能是SQL-server SQL。SQL-server支持函数DATEADD,DATEGET,DATEDIFF和DATEPART,并按照你的方式和用法声明用户变量。 –

+0

当输入:SET @ Hours = 24/*用户输入有小时* /期望的结果将是:1天,而不是现在它显示:1天0小时........ ..............................另外:输入时:SET @ Hours = 48/*用户输入有小时* /期望结果将是:2天,而现在它显示:2天0小时 – neer0097

回答

1

使用CASE检查是否应该使用小时零件。

查询

DECLARE @Hours AS INT 
DECLARE @SubtractDate AS DATETIME 

SET @Hours=24/* User input to have hours */ 
SET @SubtractDate=DATEADD(hh,@Hours,GETDATE()) - GETDATE() 

if @Hours>=24 


SELECT 
    CONVERT(VARCHAR(10),DATEDIFF(DAY,'1900-01-01',@SubtractDate))+ ' Day(s) ' + 

    + 

    CASE 
    WHEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) > 0 
    THEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) + ' Hour(s)' 
    ELSE '' 
    END 

    AS [Result] 

Else 
    SELECT 
    CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate))+ ' Hour(s) ' 
    AS [Result] 

结果集@时间= 24

| Result | 
|-----------| 
| 1 Day(s) | 

结果集@小时= 25

|    Result | 
|--------------------| 
| 1 Day(s) 1 Hour(s) | 

结果SET @小时= 48

| Result | 
|-----------| 
| 2 Day(s) | 

编辑:输出格式化

查询

DECLARE @Hours AS INT 
DECLARE @SubtractDate AS DATETIME 

SET @Hours=1/* User input to have hours */ 
SET @SubtractDate=DATEADD(hh,@Hours,GETDATE()) - GETDATE() 

if @Hours>=24 


SELECT 
    CASE 
    WHEN CONVERT(VARCHAR(10),DATEDIFF(DAY,'1900-01-01',@SubtractDate)) = 1 
    THEN CONVERT(VARCHAR(10),DATEDIFF(DAY,'1900-01-01',@SubtractDate))+ ' Day ' 

    WHEN CONVERT(VARCHAR(10),DATEDIFF(DAY,'1900-01-01',@SubtractDate)) >= 2 
    THEN CONVERT(VARCHAR(10),DATEDIFF(DAY,'1900-01-01',@SubtractDate))+ ' Days ' 
    END 

    + 

    CASE 
    WHEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) > 0 
    THEN CASE 
      WHEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) = 1 
      THEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) + ' Hour' 

      WHEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) >= 2 
      THEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) + ' Hours'   
     END 
    ELSE '' 
    END 

    AS [Result] 

Else 
    SELECT 
    CASE 
    WHEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) > 0 
    THEN CASE 
      WHEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) = 1 
      THEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) + ' Hour' 

      WHEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) >= 2 
      THEN CONVERT(VARCHAR(10),DATEPART(hh,@SubtractDate)) + ' Hours'   
     END 
    ELSE '' 
    END 
    AS [Result] 

结果集@小时= 1

| Result | 
|--------| 
| 1 Hour | 

结果集@小时= 2

| Result | 
|---------| 
| 2 Hours | 

结果集@时间= 24

| Result | 
|--------| 
| 1 Day | 

结果集@小时= 25

|    Result | 
|--------------------| 
| 1 Day 1 Hour  | 

结果集@小时数= 26

|  Result | 
|---------------| 
| 1 Day 2 Hours | 

结果集@小时= 48

| Result | 
|-----------| 
| 2 Days | 
+0

感谢您的这一点,但是当我把SET @ Hours = 65其结果是:2天17小时 – neer0097

+0

对不起,我感到困惑。我的意思是2天17小时是好的,但我怎么能把1天1小时而不是1天1小时抱歉,因为如此挑剔 - 任何帮助都会真正实现的 – neer0097

+0

@rumana应该是正确的2 * 24 = 48 .. 65 - 48 = 17 ... 72小时应该是3天 –

相关问题