SQL更新基于具有两个参数的查询结果

时间:2015-04-08 16:25:03

标签: sql-server tsql

我已经在SQL Server中创建了一个虚拟表,该表距离当前日期有28天,每个日期的行时间为12-10 pm,增量为15分钟,另一个值表示它为&#39 ; s打开/关闭可用性,所以它会是这样的:

date          time          onoff
-------------------------------------------------
2015-04-08    12:00         1
2015-04-08    12:15         1
....continue until 22:00 then start next day
2015-04-09    12:00         1
..... continue for 28 days

我想根据另一个表中的查询更新可用性,该表会返回日期,开始和结束时间...

到目前为止,我想出了这个

update table1 
set onoff = 0 
where tbl1date in (select tbl2date from table2 where userid = 1)

我遇到的问题是在某个时间段之间添加等式,我不知道如何在SQL中做这样的事情,或者如何根据不存在来搜索答案能够正确地说出来......

有人可以帮助或指出我正确的方向吗?

3 个答案:

答案 0 :(得分:0)

使用DATETIME,不要使用单独的DATE和TIME字段。

答案 1 :(得分:0)

我认为你应该看看DATEDIFF(https://technet.microsoft.com/pl-pl/library/ms189794(v=sql.110).aspx)函数。

您的查询位置如下:

update table1 set onoff = 0 
where 
    DATEDIFF(minute, <MIN_RANGE>, tbl1date) >= 0 and 
    DATEDIFF(minute, tbl1date, <MAX_RANGE>) >= 0

如何计算MIN_RANGE和MAX_RANGE取决于你的table2结构。

答案 2 :(得分:0)

根据建议,如果您可以控制结构,请使用datetime字段,因为它们更容易进行比较。我假设你无法控制结构。

为了比较您需要在不同日期和时间创建它们的日期时间。您可以解析小时和分钟的时间字段,并使用DATEADD将适当的偏移量添加到日期,或者您可以使用CONVERT将日期时间字符串解释为日期。像

这样的东西
CONVERT(datetime, SUBSTRING(CONVERT(varchar, tbl1date, 121), 1, 10) + ' ' + tbl1time, 121)

这样做的目的是将日期转换为odbc cannonical格式,并将时间部分丢弃,因为它只需要前10个字符。然后它附加时间并将整个字符串解释为odbc cannonical日期时间字符串。这种格式是yyyy-mm-dd hh:mi:ss.mmm。工作时间基于24小时。因此,如果您的时间是AM / PM格式,您将不得不转换它们。

如果您的其他桌子有不同的日期和时间,您可以使用类似的表达式来组合它们。

如果你有日期时间,你可以做这样的事情

UPDATE table1
SET onoff = 0
WHERE <expression above> BETWEEN (SELECT min_value FROM table2) AND (SELECT max_value FROM table2)