标签: date-math

如果不满足限制,则将默认行添加到查询结果中

我有一个 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?

sql-server date-math

11
推荐指数
3
解决办法
3179
查看次数

SQL Server 中的日期数学是如何工作的?

我经常在子句中看到用DATEADD和编写的查询来定义一个范围,将日期时间展平为 0 小时,或者找到一个月或一年的最后一天,但我不明白所有部分是如何工作的。DATEDIFFWHERE

例如,这将查找从当天开始到 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)

这的所有不同部分都完成了什么?

sql-server date-math

7
推荐指数
1
解决办法
2683
查看次数

沿线插入日期

road_conditionOracle 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)

oracle oracle-12c computed-column date-math

5
推荐指数
2
解决办法
783
查看次数

如何将时间四舍五入到任意时间间隔的上倍数?

例子:

  • 如果当前时间为 2018-05-17 22:45:30 且所需时间间隔为INTERVAL '5 minute',则所需输出为 2018-05-17 22:50:00。
  • 如果当前时间为 2018-05-17 22:45:30 且所需时间间隔为INTERVAL '10 minute',则所需输出为 2018-05-17 22:50:00。
  • 如果当前时间为 2018-05-17 22:45:30 并且所需的时间间隔为INTERVAL '1 hour',则所需的输出为 2018-05-17 23:00:00。
  • 如果当前时间是 2018-05-17 22:45:30 并且期望的间隔是INTERVAL '1 day',那么期望的输出是 2018-05-18 00:00:00。

postgresql datetime interval date-math

5
推荐指数
1
解决办法
3613
查看次数

时间标准差

是否有 T-SQL 编码最佳实践来获得一组时间的准确标准偏差值?STDEV不喜欢time数据类型。我在想,可能是将分钟转换为整数,但是从/到什么的转换?有什么建议?

sql-server type-conversion time date-math

5
推荐指数
1
解决办法
313
查看次数

仅使用 LIKE 运算符记录大于纪元时间戳的记录

到目前为止,我有以下查询,不幸的是,我无法使用正则表达式大于运算符,我只能使用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 …

sql-server json sql-server-2014 like date-math

5
推荐指数
2
解决办法
1185
查看次数

按历史“本月最后一天”过滤表

我有一个每日附加表,我需要一个公式来将表结果过滤到任何给定历史月份的最后一天。例如:

桌子:

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)

sql-server date sql-server-2016 date-math

3
推荐指数
1
解决办法
223
查看次数

如何向时间戳列添加日/夜指示器?

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'指标。

postgresql query date-format date date-math

2
推荐指数
1
解决办法
784
查看次数

展开日期范围

我有下表,其中包含以下数据:

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)

sql-server sql-server-2014 date-math

2
推荐指数
1
解决办法
121
查看次数

PostgreSQL 中的办公时间

如何在 PostgreSQL 行中存储办公时间,以便我可以计算办公时间。

例子:

  • 我们周一至周五的营业时间为 9:00 至 18:00。
  • 星期六我们的营业时间为 10:00 至 15:00
  • 从 12 月 24 日到 12 月 31 日我们的营业时间为 10:00 到 13:00(但周六和周日不营业)
  • 12 月 25/26 日等银行假期关闭。
  • 以上所有规则有效期至 2021 年 12 月 31 日。
  • 从 2022 年 1 月 1 日开始,我们的营业时间为周一至周五的 10:00 至 18:00。星期六和以前一样开放。

我想将这些数据按行存储,以便我们可以为其开发接口。

然后需要一种使用行/规则来计算具体开放时间的方法。

在这种情况下,不同的时区并不重要。

我使用 PostgreSQL 12.6 版。但如果需要,我可以升级到更新的版本。

postgresql datetime date-math

1
推荐指数
1
解决办法
50
查看次数

获得第三个星期五之后的第一个星期一

我在这个网站上看到了如何获得本月的第三个星期五:

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)

在第三个星期五之后,我将如何获得第一个星期一?

sql-server date-math

1
推荐指数
1
解决办法
597
查看次数

每小时半点的值总和(那个小时)

我需要用 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)

sql-server aggregate date-math

0
推荐指数
1
解决办法
89
查看次数