我想 在 SQL Server 2008 R2 上使用T-SQL BULK INSERT插入带有可选日期时间值(每行)的行。
一张表可能如下所示:
CREATE TABLE [dbo].[tbl_bulk_insert_datetime_issue] (
[id] [int] NOT NULL,
[description] [varchar](20) NOT NULL,
[datetime] [datetime] NULL,
CONSTRAINT [pk_bulk_insert_datetime_issue] PRIMARY KEY CLUSTERED (
[id] ASC
))
Run Code Online (Sandbox Code Playgroud)
插入批次:
BULK
INSERT [dbo].[tbl_bulk_insert_datetime_issue]
FROM 'C:\temp\bulkinsertsample.csv'
WITH
(
FIELDTERMINATOR=';'
)
Run Code Online (Sandbox Code Playgroud)
如果我要插入以下 CSV 内容:
1;row01;
2;row02;20130401
3;row03;
4;row04;20130515
Run Code Online (Sandbox Code Playgroud)
表的内容已按预期解析和插入:
id description datetime
----------- -------------------- -----------------------
1 row01 NULL
2 row02 2013-04-01 00:00:00.000
3 row03 NULL
4 row04 2013-05-15 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
1;row01;
2;row02;20130401
3;row03;not_a_datetime …Run Code Online (Sandbox Code Playgroud) 我正在为一个保存大量日志的系统设计一个表。我们正在查看每秒大约 200 个条目。
我们使用的是 SQL-Server 2012 企业版。
我有一个关于将一Datetime列分成两列的问题,Date并且Time.
我在问题背后的想法。我会说一旦数据存储在数据库中,大多数搜索将基于每天,给我今天/1 月 10 日的所有结果。
现在我仍然需要存储时间。因此,如果我将其存储为datetime,则在执行此查询时,sql 将不得不加载整个datetime字段,然后只查看一半的数据。
因此,通过可能将日期存储在其自己的字段中,它可以只查看它需要的内容。
但另一方面,如果您确实在查询中指定了时间,则它现在必须检查两列的值。
因此,我希望 SQL Gurus 提供关于哪个选项对大型数据库的查询具有更好的性能的输入。
据我所知datetime,可以高度优化并且是比分解更好的解决方案。
当您尝试在 SQL Server 中将 DATETIME 转换为 VARCHAR 时,默认的日期格式样式是一种相当不准确的日期格式,会丢失秒和毫秒的精度。例如:
SELECT CAST(GETDATE() AS VARCHAR)
-- May 8 2015 9:13AM
Run Code Online (Sandbox Code Playgroud)
有没有办法更改使用的默认样式?例如,我想使用样式 126 使结果看起来更像这样:
SELECT CAST(GETDATE() AS VARCHAR)
-- 2015-05-08T09:14:19.437
Run Code Online (Sandbox Code Playgroud)
如果可能,我只想更改当前流程或语句的默认样式;但是,我也愿意在数据库或模式级别更改它。
我应该注意:我知道 CONVERT 和手动指定样式的能力。但是,在这种特殊情况下,我无法使用 CONVERT。我将 SQL_VARIANT 参数作为 VARCHAR 转换为标量值函数。
由于闰秒,这个夜晚会更长:https : //en.wikipedia.org/wiki/Leap_second
在我的情况下,我的影响很小,我什至不知道我是否会收到一些奇怪的数据,比如20150630 23:59:60。但是我有来自 windows、linux 和其他系统的监控系统。在最坏的情况下,我将丢失一秒钟的数据。
我在 postgresql 和 SQL Server 中测试了这个奇怪数据的转换。这些是我的结果:
Postgresql 中的这个选择:
SELECT '20150630 23:59:60.001 UTC'::timestamptz;
Run Code Online (Sandbox Code Playgroud)
返回:2015-07-01 02:00:00.001+02
我有相同的结果:
SELECT '20150701 00:00:00.001 UTC'::timestamptz;
Run Code Online (Sandbox Code Playgroud)
我认为这在关键系统中可能很危险,因为如果这些数据由客户端处理,数据可能会以错误的顺序存储,从而为合法数据增加一秒钟。
在 sql server 中,如果我尝试:
SELECT CAST('20150630 23:59:60' AS datetime)
Run Code Online (Sandbox Code Playgroud)
它给了我一个转换错误。所以在 sql server 中是不可能存储这些数据的。
一个给我一个错误,另一个只是添加一秒钟。我不喜欢两者,因为不可能在闰秒中存储事件。
两者都是最新的系统。SQL Server 在 windows 2012 机器上是 2014。Postgresql 在 redhat 机器上是 9.3(不是那么更新,我认为是 6.2)。
如果有人要我存储这些数据怎么办?我读了这个和一些解决方法:https : //stackoverflow.com/questions/19751115/leap-second-handling-in-database
有没有人遇到过这个问题?我的意思是,就我而言,这只是一个理论问题,不是真正的问题(所以如果你不喜欢理论问题,请不要浪费时间)
编辑: 在 Oracle 11.2 中测试,返回错误:
ORA-01852: 秒必须在 0 到 59 之间 01852. 00000 - “秒必须在 0 到 …
我的兴趣是用 FSP 为 6 来存储时间。正如我所读到的,这不能用TIMESTAMPorDATETIME数据类型来实现。所以,我有一个double字段来存储microtime函数的输出。
无论如何我可以为这样的字段设置(甚至编写一些代码来创建)默认值吗?
我想使用类似的东西NOW(6)并获取1442059062.065123例如。
我有两个表 - 一个标题为“计划约束”的表,其中包含“sot_allowed”时间间隔,另一个标题为“计划”,其中包含“sot_contribution”时间间隔。
以下是两个表的架构(为便于阅读而进行了编辑):
Table "public.planning_constraints"
Column | Type | Modifiers
-------------+--------------------------+-------------------------------
start_time | timestamp with time zone |
end_time | timestamp with time zone |
sot_allowed | interval |
Table "public.planning"
Column | Type | Modifiers
------------------+--------------------------+----------------------------
start_time | timestamp with time zone |
end_time | timestamp with time zone |
sot_contribution | interval |
Run Code Online (Sandbox Code Playgroud)
我可以分别查询它们并生成我想要的总数。“planning_constraints”表的查询是:
SELECT
date_trunc('day', start_time - INTERVAL '18 hours')::date AS planning_day,
sum(sot_allowed) AS minutes_allowed
FROM planning_constraints
WHERE start_time>='2016-11-26 18:00:00+00' AND start_time<'2016-12-03 18:00:00+00' AND comment like …Run Code Online (Sandbox Code Playgroud) 我的第一个问题在这里,但我查看了许多其他地方并找不到我的问题的答案。
id | track_seg_id | time
----+--------------+---------------------
1 | 0 | 2020-05-23 07:45:32
2 | 0 | 2020-05-23 07:46:04
3 | 0 | 2020-05-23 07:46:53
4 | 0 | 2020-05-23 07:46:58
5 | 0 | 2020-05-23 07:47:03
6 | 0 | 2020-05-23 07:47:08
7 | 0 | 2020-05-23 07:47:11
8 | 0 | 2020-05-23 07:47:16
9 | 0 | 2020-05-23 07:47:20
10 | 0 | 2020-05-23 07:47:23
Run Code Online (Sandbox Code Playgroud)
我想要做的是progressive sum从第一行到下一行获得几秒钟。
id | track_seg_id | time | prog
----+--------------+---------------------+---------------------
1 …Run Code Online (Sandbox Code Playgroud) 我有一个包含 unix 时间日期和一个单独的毫秒字段的表。我现在尝试从两个字段中创建一个日期以供以后计算(例如过滤时间范围)。将毫秒添加到通过...创建的日期后
dateadd(S, [timestamp_s], '1970-01-01')
Run Code Online (Sandbox Code Playgroud)
通过添加另一个DATEADD...
dateadd(MS, [timestamp_ms], dateadd(S, [timestamp_s], '1970-01-01')) eventdate
Run Code Online (Sandbox Code Playgroud)
...然后输出日期毫秒有时关闭一毫秒。出于好奇,我然后尝试提取毫秒,看看这给出了什么,然后又减少了 1 毫秒。
我认为这与内部浮点精度有关,但我在数据中看不到任何规则。有时每个操作都会减少 1 毫秒,有时第一个会减 1,但 DATEPART 然后会再次加 1,等等。
由于这可能会导致某些用户感到沮丧,因此我想了解这种行为并在理想情况下找到问题的解决方案。提前致谢。
我经常遇到以下问题。我有两张间隔表。它们受日期限制(没有时间部分)。每个表中的间隔不重叠。
| 开始时间 | 结束时间 |
|---|---|
| 2015-01-03 | 2015-03-02 |
| 2015-03-05 | 2015-04-01 |
| 开始时间 | 结束时间 |
|---|---|
| 2015-01-07 | 2015-02-27 |
| 2015-03-01 | 2015-03-13 |
| 2016-01-01 | 2016-01-02 |
我想找到两个表的集合差异,即代表第一个表中而不是第二个表中的时间的间隔。
上面的虚拟示例所需的输出:
| 开始时间 | 结束时间 |
|---|---|
| 2015-01-03 | 2015-01-06 |
| 2015-02-28 | 2015-02-28 |
| 2015-03-14 | 2015-04-01 |
即,如果第一个表的日期在下面用黄色标记,并且第二个表的范围用框包围,我将寻找未装箱的黄色日期的连续范围。
我目前将两端都视为包含间隔,并使用 DateTime 作为时间戳。我当前的方法是通过三重自连接(恶心)获取第二个表的补集,然后通过连接将结果与第一个表相交。不好玩。
有更好的方法吗?
我有一个使用French_CI_AS排序规则的 SQL Server 法语安装。出于遗留原因,表列将数据存储VARCHAR为稍后转换为正确类型的数据,类似于 C++ 中的变体。
此列中的两行数据如下:
2020-10-12 22:54:40
2020-10-13 04:42:10
Run Code Online (Sandbox Code Playgroud)
DATETIME使用默认选项转换为时,第二个日期失败。该应用程序使用 ODBC 转义序列。SQL 等COLMVALUE >= {ts'2020-01-01 00:00:00'}失败并显示错误:
La Conversion d'un type de données nvarchar en type de données datetime a créé une valeur hors limites
我做了一个DBCC useroptions ,服务器的日期格式设置为dmy. 为什么第 2 行失败?看起来它试图将“13”解释为月份。如果格式是dmy,两个日期不应该都失败吗?
此外,有趣的是,在此服务器上,以下失败:
2020-10-12 22:54:40
2020-10-13 04:42:10
Run Code Online (Sandbox Code Playgroud)
但这有效:
DECLARE @datevar DATETIME = '2020-10-13 04:42:10';
SELECT @datevar;
Run Code Online (Sandbox Code Playgroud)
我知道这DATETIME2比DATETIME. 但是,这里的两者似乎连解析都不一样。
collation type-conversion datetime localization sql-server-2016
datetime ×10
sql-server ×5
postgresql ×3
t-sql ×2
aggregate ×1
bulk-insert ×1
cast ×1
coalesce ×1
collation ×1
datatypes ×1
date ×1
interval ×1
join ×1
localization ×1
mysql ×1
sum ×1
timestamp ×1