我已经在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中做这样的事情,或者如何根据不存在来搜索答案能够正确地说出来......
有人可以帮助或指出我正确的方向吗?
答案 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)