鉴于以下组件
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Run Code Online (Sandbox Code Playgroud)
将它们结合起来以产生DATETIME2(7)具有价值的结果的最佳方法是'2013-10-13 23:59:59.9999999'什么?
有些东西不工作,如下表所示。
SELECT @D + @T
Run Code Online (Sandbox Code Playgroud)
操作数数据类型日期对加法运算符无效。
SELECT CAST(@D AS DATETIME2(7)) + @T
Run Code Online (Sandbox Code Playgroud)
操作数数据类型 datetime2 对加法运算符无效。
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
Run Code Online (Sandbox Code Playgroud)
datediff 函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试将 datediff 与不太精确的日期部分一起使用。
* 可以在 Azure SQL 数据库和 SQL Server 2016 中避免溢出,使用DATEDIFF_BIG.
SELECT CAST(@D AS DATETIME) + @T
Run Code Online (Sandbox Code Playgroud)
数据类型 datetime 和 time 在 add 运算符中不兼容。
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
返回结果但失去精度
2013-10-13 23:59:59.997
假设我想在 24 小时内每 5 分钟生成一个系列。我如何在 PostgreSQL 中做到这一点?
PostgreSQL 可以generate_series()来自 a timestamp,但不能来自time.
选择任意时间戳更好,还是有另一种生成系列的方法?
我正在开发一项服务,该服务依赖于用户能够接收他们自己选择的消息。这些消息在发送进行处理之前需要存储在某处。
现在我将它们存储在 postgres 数据库中,但我觉得它不能很好地扩展。
目前的布局是:
ID - MESSAGE - DATE - TIME
Run Code Online (Sandbox Code Playgroud)
DATE 和 TIME 字段保存应该发送消息进行处理的时间和日期。这不能很好地扩展,好像需要在每个月的第一个星期一发送一条消息,它会占用 12 倍的空间。
问题是我似乎无法找到另一种方式来表示何时应该发送消息进行处理?理想情况下,我希望能够在一行中表示每个日期。
我们也在讨论使用 Redis,但很快就决定不使用,因为我们需要 webfrontend 的数据库。
任何人都知道如何优化消息存储?如何表示何时应该发送消息进行处理?
我也愿意就如何解决这个问题提出任何其他建议。
你会使用哪个,为什么?单独的时间维度还是在事实表中放置时间戳?或者两者兼而有之?
我正在构建一个数据仓库,需要表示事件发生的时间,精确到一秒。我想汇总数据;例如,绘制一天中每小时的事件数量图。
Kimball 的“The Data Warehouse Toolkit”,有一个时间维度的设计。最近的一篇博文建议不要这样做,而是在事实表中使用时间戳:
http://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/
如果我在事实表中使用时间戳,按小时汇总是否仍然容易/快速?
做出此选择时还需要考虑其他任何权衡吗?
使用 postgresql 9.6。
该表有用户会话,我需要打印不同的非重叠会话。
CREATE TABLE SESSIONS(
id serial NOT NULL PRIMARY KEY,
ctn INT NOT NULL,
day DATE NOT NULL,
f_time TIME(0) NOT NULL,
l_time TIME(0) NOT NULL
);
INSERT INTO SESSIONS(id, ctn, day, f_time, l_time)
VALUES
(1, 707, '2019-06-18', '10:48:25', '10:56:17'),
(2, 707, '2019-06-18', '10:48:33', '10:56:17'),
(3, 707, '2019-06-18', '10:53:17', '11:00:49'),
(4, 707, '2019-06-18', '10:54:31', '10:57:37'),
(5, 707, '2019-06-18', '11:03:59', '11:10:39'),
(6, 707, '2019-06-18', '11:04:41', '11:08:02'),
(7, 707, '2019-06-18', '11:11:04', '11:19:39');
Run Code Online (Sandbox Code Playgroud)
id ctn day f_time l_time …Run Code Online (Sandbox Code Playgroud) 这个问题已经出现过几次了,例如在postgresql 新闻组和wiki中。一般来说,不同intervals 之间的关系可能没有明确定义 - 一个月可能有不同的天数,具体取决于所考虑的月份(和年份)。但有时需要计算两个时间点之间发生了多少个间隔,例如(简化示例):
CREATE TABLE recordings(tstart timestamp, tend timestamp, interval ticklength);
SELECT (tend - tstart) / ticklength AS numticks
FROM recordings;
Run Code Online (Sandbox Code Playgroud)
这在 PostgreSQL 中是不允许的,因为它是两个间隔之间的划分,由于上述原因,这不会有明确定义的一般行为。当间隔可以转换为秒时,存在一种解决方法,但如果不是这种情况,例如当间隔为毫秒量级时,最好的方法是什么?
我有 2 个表:tbl1、tbl2。
CREATE TABLE tbl1(time_1)
AS VALUES
( '2017-09-06 15:26:03'::timestamp ),
( '2017-09-06 15:26:02' ),
( '2017-09-06 15:28:01' ),
( '2017-09-06 15:40:00' );
CREATE TABLE tbl2(time_2)
AS VALUES
( '2017-09-06 15:29:01'::timestamp ),
( '2017-09-06 15:40:00' ),
( '2017-09-06 15:23:59' ),
( '2017-09-06 15:45:58' );
Run Code Online (Sandbox Code Playgroud)
我想加入表格,因此对于 tbl1 中的每一行都匹配 tbl2 中最接近的时间。输出是:
time_1 time_2
--------------------- --------------------
2017-09-06 15:26:03 2017-09-06 15:23:59
2017-09-06 15:26:02 2017-09-06 15:23:59
2017-09-06 15:28:01 2017-09-06 15:29:01
2017-09-06 15:40:00 2017-09-06 15:45:58
Run Code Online (Sandbox Code Playgroud)
我知道如何找到最近时间的单个值:
SELECT * from tbl1 where time_1=INPUT_TIME ORDER BY case …Run Code Online (Sandbox Code Playgroud) 我正在构建一个应用程序来计算电子商务网站客户的不同KPI 指标,例如(平均订单价值、平均项目数等)。KPI 是整数和/或双值,例如购买的商品数量、平均值。订单价值、毛利率...
该应用程序获取订单数据、计算指标并存储它们。我使用 MySQL 作为关系数据库。
关于指标:
我目前有 10 个指标要为每个客户计算。
指标在未来可能会增加,但不会那么频繁,所以我可以认为“10”是非常确定的。无论如何,将来更改架构根本不是问题。
我需要每周(至少)计算每个指标。指标是关于客户的。
关于客户:
客户有 30k,并且以每月 0.5k 的速度增长。
并非所有客户都以相同的频率购买。我可以有偶尔的买家,但也有重度买家。
我想显示一个图表,其中包含给定时间跨度内特定 KPI 的总体趋势。
我想显示一个图表,其中包含给定时间跨度内特定客户的指标趋势。
我的实体是:
我担心存储大量无用数据
52 周 * 30k 用户 * 4+ 年 = 至少 620 万行
我有两个问题:
我是否应该在给定的时间跨度内为没有订单的客户存储行(例如,该行将全部填充为 NULL)?可以在不影响数据可视化的情况下以某种方式避免它吗?
考虑到并非所有客户每周都购买并且指标数量不太可能经常更改,哪种表结构更有效(“瘦”表与“胖”表)?
我对customers_kpi表的这两个结构存有疑问:
| 顾客ID | kpi1 | kpi2 | kpi3 | ..kpiN | 从 | 到 |
|---|
VS
| 顾客ID | kpi_name | kpi_value | 从 | 到 |
|---|
我需要总结由多个时间范围产生的时间。例如 - 我们有一些办公室的进入/退出范围:
查询必须:
这种情况下的预期结果是 8:00(8:00 到 12:00 + 14:00 到 18:00)
示例表结构:
DAY | TIME_ENTER | TIME_EXIT
2016-01-01 | 08:00 | 10:00
2016-01-01 | 08:00 | 12:00
2016-01-01 | 14:00 | 18:00
Run Code Online (Sandbox Code Playgroud)
预期结果:
DAY | TOTAL
2016-01-01 | 08:00
Run Code Online (Sandbox Code Playgroud)
表结构:
CREATE TABLE Registry
(`Date` DATE,
`Enter` TIME,
`Exit` TIME);
Run Code Online (Sandbox Code Playgroud)
示例插入
INSERT INTO Registry
VALUES
('2016-01-01', '08:00', '09:00'),
('2016-01-01', '08:00', '12:00'),
('2016-01-01', '14:00', '18:00')
Run Code Online (Sandbox Code Playgroud) 沿着这个相关问题的思路:
是否有任何有效的实际使用用例 TIME WITH TIME ZONE或应该将其视为反模式?
需要明确的是:我问的是TIME…,而不是TIMESTAMP…。
time ×10
postgresql ×6
datatypes ×2
mysql ×2
date ×1
datetime2 ×1
dimension ×1
join ×1
range-types ×1
sql-server ×1
sum ×1
timezone ×1