- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我有日期时间格式的日期列表:
6/30/2015 10:44:44 PM
6/30/2015 11:00:24 PM
7/1/2015 12:22:46 AM
7/1/2015 12:26:38 AM
7/1/2015 2:55:04 AM
7/1/2015 3:23:00 AM
7/1/2015 3:32:09 AM
7/1/2015 3:52:27 AM
7/1/2015 3:57:25 AM
7/1/2015 4:03:34 AM
7/1/2015 4:23:52 AM
7/1/2015 4:32:00 AM
7/1/2015 4:50:03 AM
7/1/2015 4:54:46 AM
7/1/2015 5:10:20 AM
7/1/2015 5:13:37 AM
7/1/2015 5:18:51 AM
....
7/31/2015 11:18:51 PM
我想为列表中的每个日期抓取离凌晨 5 点最近的时间。我该怎么办?
SELECT TOP 1 *
FROM x
WHERE x.date < @CurrentDate
ORDER BY x.date DESC
应该获取离当前日期最近的日期,但对于每个不同的日期?
最佳答案
您可以使用 TIMEDIFF
和 TIME_TO_SEC
获取与其他日期“最近”的日期的方法:
SELECT
d
FROM
test
ORDER BY
ABS(TIME_TO_SEC(TIMEDIFF(d, "2015-10-23 19:00:00")))
LIMIT
0,1 ;
http://sqlfiddle.com/#!9/5b67f/2
要获取每天的关闭日期和可用条目,您需要扩展此查询,因此它不会与固定日期进行比较,而是“每天早上 5 点”:
要实现这一点:
DATE(d)
date
(或 min(date)
)由于分组*(在帖子末尾注释)可能是错误的,我们使用我们定位的日期加上(或减去)偏移量(这是正确的 由于与 min()
聚合一起分组)在示例中DATE_ADD(DATE(d), INTERVAL 19 HOUR)
用于确定7 pm
对于当前行。对于 5 am
它将是 DATE_ADD(DATE(d), INTERVAL 5 HOUR)
:
(我在查询中留下了用于调试的列,它们可以从中删除。您只需要 actualDate
-列)
SELECT
DATE(d) AS day,
MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR))))) AS offset,
MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) AS controlOffset1,
MIN(TIME_TO_SEC(TIMEDIFF(DATE_ADD(DATE(d), INTERVAL 19 HOUR),d))) AS controlOffset2,
CASE
WHEN MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR))))) = MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) && MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) > 0 THEN
DATE_Add(DATE_ADD(DATE(d), INTERVAL 19 HOUR), INTERVAL
MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))))
SECOND)
WHEN MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR))))) = MIN(TIME_TO_SEC(TIMEDIFF(DATE_ADD(DATE(d), INTERVAL 19 HOUR),d))) THEN
DATE_SUB(DATE_ADD(DATE(d), INTERVAL 19 HOUR), INTERVAL
MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))))
SECOND)
WHEN MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) = MIN(TIME_TO_SEC(TIMEDIFF(DATE_ADD(DATE(d), INTERVAL 19 HOUR),d))) THEN
DATE_ADD(DATE_ADD(DATE(d), INTERVAL 19 HOUR), INTERVAL
MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))))
SECOND)
WHEN MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) <> MIN(TIME_TO_SEC(TIMEDIFF(DATE_ADD(DATE(d), INTERVAL 19 HOUR),d))) THEN
DATE_SUB(DATE_ADD(DATE(d), INTERVAL 19 HOUR), INTERVAL
MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))))
SECOND)
END AS actualDate,
case
WHEN MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR))))) = MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) && MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) > 0 THEN
"TEST#1"
WHEN MIN(ABS(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR))))) = MIN(TIME_TO_SEC(TIMEDIFF(DATE_ADD(DATE(d), INTERVAL 19 HOUR),d))) THEN
"TEST#2"
WHEN MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) = MIN(TIME_TO_SEC(TIMEDIFF(DATE_ADD(DATE(d), INTERVAL 19 HOUR),d))) THEN
"TEST#3"
WHEN MIN(TIME_TO_SEC(TIMEDIFF(d, DATE_ADD(DATE(d), INTERVAL 19 HOUR)))) <> MIN(TIME_TO_SEC(TIMEDIFF(DATE_ADD(DATE(d), INTERVAL 19 HOUR),d))) THEN
"TEST#4"
END AS testCase
FROM
test
GROUP BY DATE(d)
数据:
CREATE table test (d datetime);
# TEST 1: Solution later
INSERT INTO test (d) values ("2015-10-23 19:10:00"); #this
INSERT INTO test (d) values ("2015-10-23 19:20:00");
INSERT INTO test (d) values ("2015-10-23 19:30:00");
INSERT INTO test (d) values ("2015-10-23 19:40:00");
INSERT INTO test (d) values ("2015-10-23 19:50:00");
# TEST 2: Solution earlier
INSERT INTO test (d) values ("2015-10-24 18:10:00");
INSERT INTO test (d) values ("2015-10-24 18:20:00");
INSERT INTO test (d) values ("2015-10-24 18:30:00");
INSERT INTO test (d) values ("2015-10-24 18:40:00");
INSERT INTO test (d) values ("2015-10-24 18:50:00");#this
# TEST 3: Solution later, but earlier available
INSERT INTO test (d) values ("2015-10-25 18:30:00");
INSERT INTO test (d) values ("2015-10-25 18:40:00");
INSERT INTO test (d) values ("2015-10-25 18:50:00");
INSERT INTO test (d) values ("2015-10-25 19:05:00"); #this
INSERT INTO test (d) values ("2015-10-25 19:10:00");
INSERT INTO test (d) values ("2015-10-25 19:20:00");
INSERT INTO test (d) values ("2015-10-25 19:30:00");
# Test 4: Solution earlier, but later available
INSERT INTO test (d) values ("2015-10-26 18:30:00");
INSERT INTO test (d) values ("2015-10-26 18:40:00");
INSERT INTO test (d) values ("2015-10-26 18:50:00");
INSERT INTO test (d) values ("2015-10-26 18:55:00"); #this
INSERT INTO test (d) values ("2015-10-26 19:10:00");
INSERT INTO test (d) values ("2015-10-26 19:20:00");
INSERT INTO test (d) values ("2015-10-26 19:30:00");
INSERT INTO test (d) values ("2015-10-26 19:40:00");
结果:
day offset controlOffset1 controlOffset2 actualDate testCase
October, 23 2015 00:00:00 600 600 -3000 October, 23 2015 19:10:00 TEST#1
October, 24 2015 00:00:00 600 -3000 600 October, 24 2015 18:50:00 TEST#2
October, 25 2015 00:00:00 300 -1800 -1800 October, 25 2015 19:05:00 TEST#3
October, 26 2015 00:00:00 300 -1800 -2400 October, 26 2015 18:55:00 TEST#4
http://sqlfiddle.com/#!9/951b5/22
解释:
Min(Abs())
偏移量,我们需要弄清楚,如果我们需要 add
7pm
的偏移量值,或 subtract
MIN(actualDate - 7pm)
MIN(7pm - actualDate)
DATE_ADD
DATE_SUB
DATE_ADD
DATE_SUB
:-)现在唯一未确定的可能是,如果两个日期 +/- 具有相同的偏移量,即 +/- 5 分钟。因此无论如何结果都是不确定的,所以你应该能够通过使用 >=
扩展一些条件来获得非空值。或 <=
. (编辑:将与案例 3 匹配,选择较晚的日期:http://sqlfiddle.com/#!9/21f2ce/2)
ps.: 与应用程序端迭代方法中的“单次获取”相比,最终解决方案的性能表现会很有趣。
*比较偏移量:为什么是Min(d - 7pm)
与 Min(7pm -d)
不同的偏移量- 不仅是标志?因为d
由于缺少聚合而未确定。因此,使用两个控制偏移,我们可以根据 7pm
确定值 正确聚合,因此可靠。)
关于c# - 为连续日期选择最近的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33310400/
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!