我有一个 SQL 查询,用于在表中查找某个日期范围内的值。
如果没有找到记录,我想生成具有默认值的行。
表现有记录之一的示例:
设备ID | 时间 | 语境 | 价值 |
---|---|---|---|
1 | 2022-02-10 | 连接的 | 错误的 |
因此,限制时间列在 2022-02-07 和 2022-02-10 之间的查询必须为 2 月 7 日、8 日和 9 日创建假行,但不能为 10 日创建假行,因为该行已经存在。
预期结果:
设备ID | 时间 | 语境 | 价值 |
---|---|---|---|
1 | 2022-02-7 | 伪造的 | 错误的 |
1 | 2022-02-8 | 伪造的 | 错误的 |
1 | 2022-02-9 | 伪造的 | 错误的 |
1 | 2022-02-10 | 连接的 | 错误的 |
我怎样才能做到这一点?使用递归 CTE?
我经常在子句中看到用DATEADD
和编写的查询来定义一个范围,将日期时间展平为 0 小时,或者找到一个月或一年的最后一天,但我不明白所有部分是如何工作的。DATEDIFF
WHERE
例如,这将查找从当天开始到 30 天前一天开始的日期。
SELECT *
FROM tbl
WHERE datecol >= DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), 0)
AND datecol < DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), -30);
Run Code Online (Sandbox Code Playgroud)
这的所有不同部分都完成了什么?
我road_condition
在Oracle 12c 中有一张表:
create table road_condition (
cond_id number(5,0),
road_id number(5,0),
cond_date date,
condition number(5,0)
);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (1,100,to_date('01-NOV-84','DD-MON-RR'),18);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (2,100,to_date('01-JAN-09','DD-MON-RR'),6);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (3,100,to_date('19-JUN-12','DD-MON-RR'),4);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (4,100,to_date('29-APR-15','DD-MON-RR'),4);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (5,200,to_date('29-APR-92','DD-MON-RR'),20);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (6,200,to_date('05-APR-17','DD-MON-RR'),3);
commit;
Run Code Online (Sandbox Code Playgroud)
结果表数据:
COND_ID ROAD_ID COND_DAT CONDITION
------- ------- -------- ---------
1 100 84-11-01 18
2 100 09-01-01 6
3 100 12-06-19 4
4 100 …
Run Code Online (Sandbox Code Playgroud) 例子:
INTERVAL '5 minute'
,则所需输出为 2018-05-17 22:50:00。INTERVAL '10 minute'
,则所需输出为 2018-05-17 22:50:00。INTERVAL '1 hour'
,则所需的输出为 2018-05-17 23:00:00。INTERVAL '1 day'
,那么期望的输出是 2018-05-18 00:00:00。是否有 T-SQL 编码最佳实践来获得一组时间的准确标准偏差值?STDEV
不喜欢time
数据类型。我在想,可能是将分钟转换为整数,但是从/到什么的转换?有什么建议?
到目前为止,我有以下查询,不幸的是,我无法使用正则表达式或大于运算符,我只能使用LIKE
关键字。
整个列都在 json 字符串中,我无法使用json_value
或 regexp,因为我在 SQL Server 上,所以我只能使用LIKE
. 它是 SQL Server 2014,json_value
直到 2016 年才受支持。
SELECT * FROM DataTableOne
WHERE update_date LIKE '%1645290000%'
Run Code Online (Sandbox Code Playgroud)
我想仅使用 SQL 关键字检索纪元 unix 时间戳大于 1645290000 的所有记录LIKE
(甚至使用 SQLLIKE
运算符在 1645290000 和 9999999999 之间)。
任何帮助将不胜感激,因为这是一个非常困难的独特案例,我只能使用关键字LIKE
。
下面的示例表/数据:
CREATE TABLE DataTableOne (
ID int,
DATA varchar(MAX)
);
INSERT INTO DataTableOne (ID, DATA)
VALUES (1, '{"name":"Cole", "update_date":"2855290000"}'),
(2, '{"name":"Peter", "update_date":"1222290000"}') ;
Run Code Online (Sandbox Code Playgroud)
此类数据可能有一千行,而我只需要 update_date 大于 1645290000 …
我有一个每日附加表,我需要一个公式来将表结果过滤到任何给定历史月份的最后一天。例如:
桌子:
DwDate Balance
20181231 $10
20190131 $80
20190228 $75
20190331 $50
Run Code Online (Sandbox Code Playgroud)
99% 的时间我只需要MAX(DwDate)
,这将是:
@MaxDate = (SELECT MAX(DwDate) FROM dbo.TABLE)
Run Code Online (Sandbox Code Playgroud)
但是,有时我需要一个可以让我回到 1 或 2 个月的公式:
@MaxDate - 2 Months
Run Code Online (Sandbox Code Playgroud) timestamp
我用一列来指示一行是在白天还是晚上创建的。我的代码如下,但由于某种原因,我只得到“DAY”作为结果。我没有正确格式化值吗?
select record_id, rec_date,
case when date_part('hour', rec_date) between 20 and 07 then 'Night'
else 'Day' end as Indicator
from records;
Run Code Online (Sandbox Code Playgroud)
该rec_date
列是一个时间戳,我可以在其中看到诸如2019-11-20 21:34:02.000000
- 之类的值,它应该得到一个'Night'
指标。
我有下表,其中包含以下数据:
DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)
INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00')
INSERT INTO @MyActions VALUES (2, '2021-08-02 02:00:00')
INSERT INTO @MyActions VALUES (3, '2021-08-03 03:00:00')
INSERT INTO @MyActions VALUES (4, '2021-08-04 04:00:00')
Run Code Online (Sandbox Code Playgroud)
如何在不使用慢表值函数的情况下将每个 ActionID 分解为 10 个附加记录(当前 ActionID 的日期前 5 天和日期后 5 天)?
ActionID = 1 应该爆炸到 11 个总记录(没有时间),Action 2 应该爆炸到 11 个总记录(没有时间),依此类推
分解结果集
DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)
INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00') …
Run Code Online (Sandbox Code Playgroud) 如何在 PostgreSQL 行中存储办公时间,以便我可以计算办公时间。
例子:
我想将这些数据按行存储,以便我们可以为其开发接口。
然后需要一种使用行/规则来计算具体开放时间的方法。
在这种情况下,不同的时区并不重要。
我使用 PostgreSQL 12.6 版。但如果需要,我可以升级到更新的版本。
我在这个网站上看到了如何获得本月的第三个星期五:
select quote_date
FROM table
where datename(weekday, quote_date) = 'Friday'
and datepart(day, quote_date)>=15 and datepart(day, quote_date)<=21;
Run Code Online (Sandbox Code Playgroud)
在第三个星期五之后,我将如何获得第一个星期一?
我需要用 TS 聚合表的值的“总和”,每个半小时(60 分钟)的值列,即 00:30、01:30、02:30 等
样本数据:
Val TS
1 2019-08-12 00:00:00.013
3 2019-08-12 00:10:00.013
2 2019-08-12 00:20:00.013
2 2019-08-12 00:30:00.013
0 2019-08-12 00:40:00.013
0 2019-08-12 00:50:00.013
1 2019-08-12 01:00:00.013
7 2019-08-12 01:10:00.013
0 2019-08-12 01:20:00.013
1 2019-08-12 01:30:00.013
2 2019-08-12 01:40:00.013
0 2019-08-12 01:50:00.013
2 2019-08-12 02:00:00.013
0 2019-08-12 02:10:00.013
0 2019-08-12 02:20:00.013
0 2019-08-12 02:30:00.013
1 2019-08-12 02:40:00.013
0 2019-08-12 02:50:00.013
4 2019-08-12 03:00:00.013
3 2019-08-12 03:20:00.013
1 2019-08-12 03:30:00.013
Run Code Online (Sandbox Code Playgroud)
我们应该得到这个:
Val TS
10 2019-08-12 00:30:00
5 2019-08-12 …
Run Code Online (Sandbox Code Playgroud) date-math ×12
sql-server ×8
postgresql ×3
date ×2
datetime ×2
aggregate ×1
date-format ×1
interval ×1
json ×1
like ×1
oracle ×1
oracle-12c ×1
query ×1
time ×1