在SQL视图上更改值

时间:2014-09-07 01:54:28

标签: sql sql-server sql-server-2008

我有下表:

ID     myDate       myTime     Value
1      2014-06-01   00:00:00   100
2      2014-06-01   01:00:00   125
3      2014-06-01   02:00:00   132
4      2014-06-01   03:00:00   139
5      2014-06-01   04:00:00   145
6      2014-06-01   05:00:00   148
FF.
24     2014-06-01   23:00:00   205
25     2014-06-02   00:00:00   209
26     2014-06-02   01:00:00   215
27     2014-06-02   02:00:00   223

然后我有以下SQL语句:

SELECT * FROM MyTable WHERE myDate = '2014-06-01'
UNION ALL
SELECT * FROM MyTable WHERE myDate = DATEADD(dd, 1, '2014-06-01') AND myTime = '00:00:00'

因此结果应该是从记录号1到记录号25。 我要做的是在最后一条记录上myTime值为00:00:00,需要更改为24:00:00

有谁知道怎么做?或者不可能?

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用SQL Server的简单IIF功能:http://msdn.microsoft.com/en-au/library/hh213574.aspx

所以查询将如下所示

SELECT 
ID, 
myDate, 
IIF(myTime='00:00:00', '24:00:00', myTime) as myTime 
FROM MyTable WHERE myDate = '2014-06-01'

如果它回答了您的问题,请标记为答案

更新: 如果它是sql server 2008或更早版本,你可以使用case .. when

    SELECT ID,
            myDate,
            case when CAST(myTime AS VARCHAR(8))='00:00:00' then '24:00:00'
            else CAST(myTime AS VARCHAR(8))
            end as myTimeTemp 
            FROM MyTable WHERE myDate = '2014-06-01'
    UNION ALL
    SELECT ID,
            myDate,
            case when CAST(myTime AS VARCHAR(8))='00:00:00' then '24:00:00'
            else CAST(myTime AS VARCHAR(8))
            end as myTimeTemp  
    FROM MyTable WHERE myDate = DATEADD(dd, 1, '2014-06-01') AND myTime = '00:00:00'

答案 1 :(得分:0)

一对评论。首先,您是否将日期和时间存储在不同的列中?似乎可以简化为存储在单个列中。

无论如何,在这种情况下不需要UNION ALL,简单的OR语句会返回您正在寻找的结果。

要回答你的问题,如果你想在00:00到24:00之间更新最后的结果,这样的事情应该可以完成,而不需要ORUNION

UPDATE MyTable
SET mytime = '24:00:00'
WHERE myDate = DATEADD(dd, 1, '2014-06-01') AND myTime = '00:00:00'

如果您对日期进行硬编码(仅使用'2014-06-02'),则无需DATEADD,但我认为它是传入的变量。


编辑,根据您的意见,这应该使用CASE声明:

SELECT ID, 
       myDate, 
       CASE WHEN myDate = DATEADD(day, 1, '2014-06-01') 
            THEN DATEADD(hour, 24, myTime)
            ELSE myTime
       End newMyTime,
       Value
FROM MyTable
WHERE mydate = '2014-06-01' OR 
     (myDate = DATEADD(day, 1, '2014-06-01') AND myTime = '00:00:00')

答案 2 :(得分:0)

您可以使用or

执行此操作
SELECT *
FROM MyTable
WHERE myDate = '2014-06-01' OR
      (myDate = DATEADD(dd, 1, '2014-06-01') AND myTime = '00:00:00');

编辑:

SELECT date('2014-06-01') as mydate,
       (case when mydate <> date('2014-06-01') then '24:00:00' else mytime end) as mytime,
       REST OF COLUMNS HERE
FROM MyTable
WHERE myDate = '2014-06-01' OR
      (myDate = DATEADD(dd, 1, '2014-06-01') AND myTime = '00:00:00');