我正在使用 Postgres 数据库,并且有一个带有日期时间字段的表。对于许多记录,我们知道年份但不知道日期。有时我们知道日期但不知道年份。其他时候我们知道时间但不知道日期。
使用日期时间数据类型时如何存储部分日期信息?
我有一长串.csv文件,我想将其导入本地数据库。DATE我相信我的查询是正确的,但解析和列存在一些问题TIMESTAMP。PostgreSQL 读取这些列时需要 ISO 格式“yyyy/mm/dd”,但我的数据采用另一种格式:“dd/mm/yyyy”。
我在网上和其他 Stack Overflow 答案上读到,可以有所SET不同datestyle,但不建议这样做。
有没有办法指定要导入的列的格式?另外,我不需要从 csv 文件导入所有列:我可以省略一些列吗?
\n首先,我编写了创建表的代码(抱歉,如果列名称是意大利语,但这并不重要):
\nCREATE TABLE IF NOT EXISTS bikes (\n bici INT,\n tipo_bici VARCHAR(20),\n cliente_anonimizzato INT,\n data_riferimento_prelievo DATE,\n data_prelievo TIMESTAMP,\n numero_stazione_prelievo INT,\n nome_stazione_prelievo TEXT,\n slot_prelievo SMALLINT,\n data_riferimento_restituzione DATE,\n data_restituzione TIMESTAMP,\n numero_stazione_restituzione INT,\n nome_stazione_restituzione TEXT,\n slot_restituzione SMALLINT,\n durata VARCHAR(10),\n distanza_totale REAL,\n co2_evitata REAL,\n calorie_consumate REAL,\n penalit\xc3\xa0 CHAR(2)\n);\nRun Code Online (Sandbox Code Playgroud)\n然后我添加查询以将数据复制到表中:
\nCOPY bikes(\n bici,\n tipo_bici,\n cliente_anonimizzato,\n data_riferimento_prelievo,\n …Run Code Online (Sandbox Code Playgroud) 我有触发器和一个存储过程(所以 SP 在触发器运行时运行)。我需要一个函数来找到下一个星期六放入 SP。
所以让我们说,今天是星期三(2015-7-22)。如果我的触发器今天运行,其中的 SP 必须找到下一个星期六 (2015-7-25)。
另外,即使是星期六,但时间早于晚上 9.30,它也必须找到当天。晚上 9.30 之后,它必须在下周六返回。
我想把我的整个触发器和 sp 放在这里,但我不想在这里拥挤。我只需要想法,谢谢。
编辑:
感谢 oNaye,我编写了以下代码:
CREATE DEFINER=`root`@`localhost` PROCEDURE `newGuess`(
IN `muserID` INT,
IN `numm1` INT,
IN `numm2` INT,
IN `numm3` INT,
IN `numm4` INT,
IN `numm5` INT,
IN `numm6` INT)
begin
set @today = (select weekday(curdate())+1); /*monday is the first day in here*/
if @today<6 or @today=7 then /*it is NOT saturday*/
set @nextSaturday = (SELECT DATE_ADD(NOW(),INTERVAL IF(WEEKDAY(NOW())>=5,(6-WEEKDAY(NOW())),(5-WEEKDAY(NOW()))) DAY));
end if;
if @today = 6 then /* …Run Code Online (Sandbox Code Playgroud) 我继承了一个数据库,它有一个真正应该是 DATE 的 VARCHAR 列。没有对表单进行检查(我需要修复它),因此日期不断输入为 2016-12-4 而不是 2016-12-04 等等。
我很确定历史上有很多错误的日期,所以我对将数据类型更改为 DATE 有点怀疑,但我很好奇改变它的好策略是什么?
背景:(我是前端开发人员,不是 DBA,所以虽然我可以在 SQL 中四处走动,但我不知道我不知道的东西,而且我总是害怕我会犯一个错误,这会破坏数据库)。
Date.now()我已经将和其他普通 Unix 时间戳值的结果传递1534360109480到 SQL 中,并通过以下方式运行它们:
"@converted_date" = to_timestamp("@date") AT TIME ZONE 'UTC';
而且它始终如一地返回50591-11-28 22:32:38。
我不明白年份怎么可能是 50591,并且无论如何,日期/时间都不准确。
我究竟做错了什么?
我正在为一个保存大量日志的系统设计一个表。我们正在查看每秒大约 200 个条目。
我们使用的是 SQL-Server 2012 企业版。
我有一个关于将一Datetime列分成两列的问题,Date并且Time.
我在问题背后的想法。我会说一旦数据存储在数据库中,大多数搜索将基于每天,给我今天/1 月 10 日的所有结果。
现在我仍然需要存储时间。因此,如果我将其存储为datetime,则在执行此查询时,sql 将不得不加载整个datetime字段,然后只查看一半的数据。
因此,通过可能将日期存储在其自己的字段中,它可以只查看它需要的内容。
但另一方面,如果您确实在查询中指定了时间,则它现在必须检查两列的值。
因此,我希望 SQL Gurus 提供关于哪个选项对大型数据库的查询具有更好的性能的输入。
据我所知datetime,可以高度优化并且是比分解更好的解决方案。
我的计算机/SQL Server 2014 使用比 UTC 时间晚 5 小时的东部时区。但是当我运行以下代码时,我得到了 4 小时的差异。
CREATE TABLE datetimeoffsetfunction(
servertime DATETIME2,
utc_servertime DATETIME2,
offset_datetime DATETIMEOFFSET,
switch_offset DATETIMEOFFSET,
to_datetime DATETIMEOFFSET
);
INSERT INTO datetimeoffsetfunction
VALUES ( SYSDATETIME(),
SYSUTCDATETIME(),
SYSDATETIMEOFFSET(),
SWITCHOFFSET( SYSDATETIMEOFFSET(), '+05:00'),
TODATETIMEOFFSET( SYSDATETIME(), '+05:00')
);
The result I got is
servertime: 2016-07-09 23:59:16.4770556
utc_servertime: 2016-07-10 03:59:16.4770556
offset_datetime: 2016-07-09 23:59:16.4770556 -04:00
switch_offset: 2016-07-10 08:59:16.4770556 +05:00
to_datetime: 2016-07-09 23:59:16.4770556 +05:00
Run Code Online (Sandbox Code Playgroud)
servertime 是我的系统时间,考虑到夏令时,我可以解释为什么 servertime 和 utc_servertime 之间只有四个小时的差异。但我确实希望offset_datetime为 2016-07-09 23:59:16.4770556 -05:00除非 SQL Serve 现在考虑了夏令时。
所以我的问题是现在是否自动考虑夏令时是 SQL Server,至少从 …
我想获得一天的 00:00:00。应该在不使用的情况下完成CONCAT。有哪些选择?
我们可以CURDATE() function在选择查询中使用,但需要像2014-05-05 00:00:00. 如果NOW()会给喜欢2014-05-05 12:05:37。
我想CURDATE()在查询中添加默认值 00:00:00 。
我有一张每天排一排的桌子,可以存放大约一百万个缓慢变化的物品。
查找这些项目Item, Date以查看它们是否存在于表中。对于涉及具有不同日期的许多项目的查找,这有点慢——我的表现在有大约 2.6 亿行。但是,能够快速插入数据以及快速查询数据对我来说很有价值。
我想将其转换为一个表格,该表格通常每个项目有一行,并带有日期范围。(如果日期范围不连续,则一个项目可能有两行。)一个原始导入文件可用于按日期显示每天的项目,与现有架构匹配。每次有新的导入文件可用时,我都会更新现有行的日期范围以涵盖新的导入数据。我还需要能够重新导入文件,以便适当更新信息。在这样的文件中,可能会添加或删除某个项目以前存在的日期。
虽然这有点烦人的任务,但我知道我可以想出正确的MERGE语句来适当地更新数据,但是需要花几个小时的时间来确保我做对了,而且可能不是一个非常快的导入过程。
所以我在玩一种有点不寻常的不同模式设计,想知道是否有人可以评论它 - 好主意,坏主意,如何使用它,性能特征,陷阱等?
Item Date
---- ----------
SLAM 2016-11-01
SLAM 2016-11-02
SLAM 2016-11-03
SLAM 2016-11-05
GULP 2016-11-01
GULP 2016-11-02
GULP 2016-11-03
GULP 2016-11-05
Run Code Online (Sandbox Code Playgroud)
(请注意,2016-11-04 到目前为止已被跳过,需要尽快加载。)
这使得插入和删除数据变得非常容易,但是,数据库增长非常快——这不是最大的表,但已经接近 8 GB,它以每月 1 GB 的速度增长(实际上有两个不同的项目不同分类系统下的代码,因此第二个项目代码的索引将使用的空间增加一倍)。此外,查询花费的时间比我想容忍的要长。
Item FromDate ToDateExclusive
---- ---------- ---------------
SLAM 2016-11-01 2016-11-04
SLAM 2016-11-05 2016-11-06
GULP 2016-11-01 2016-11-04
GULP 2016-11-05 2016-11-06
Run Code Online (Sandbox Code Playgroud)
虽然这对于空间使用和查询非常有用,但是当 2016-11-04 的新导入文件同时包含SLAM和GULP时,合并过程必须确定新日期是否连续连接到两个现有日期范围,然后更新一行以包含整个范围并删除另一行。这很棘手。
如果稍后缺少 2016-11-04 的新导入文件,则GULP必须再次将单行拆分为两行,就像上面一样。这种情况很少见,但也并非不可能,尤其是考虑到文件可能会乱序导入——它们只能按需获取——并且对多个历史文件进行更正可能会产生这种情况。
Item DateBitPattern (varbinary) …Run Code Online (Sandbox Code Playgroud) 在我的数据库中,日期保留为自 1970 年 1 月 1 日起/之前经过的天数,我认为这是一种 Unix 日期格式,例如。今天是 2018 年 5 月 23 日,值为 17674。
我正在尝试select针对日期表中的列运行语句以仅显示年份。
如果我运行这个:
datepart(year, c.cko_date)
Run Code Online (Sandbox Code Playgroud)
我得到的日期是 1940 年代(应该是最近几年)。
当我跑
select datepart(year, getdate())
Run Code Online (Sandbox Code Playgroud)
它正确地告诉我日期是 2018 年。
关于我做错了什么的任何建议?
date ×10
datetime ×6
sql-server ×4
mysql ×3
postgresql ×3
t-sql ×2
csv ×1
date-format ×1
format ×1
import ×1
merge ×1
timestamp ×1
timezone ×1
trigger ×1
varchar ×1