标签: datetime

为什么 SQL Server 2008 R2 在使用批量插入时插入无效的日期时间?

我想 在 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)


但是如果 CSV 文件包含可选日期时间的无效数据

1;row01;
2;row02;20130401
3;row03;not_a_datetime …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2008-r2 datetime bulk-insert

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

日期时间列与日期 + 时间列

我正在为一个保存大量日志的系统设计一个表。我们正在查看每秒大约 200 个条目。

我们使用的是 SQL-Server 2012 企业版。

我有一个关于将一Datetime列分成两列的问题,Date并且Time.

我在问题背后的想法。我会说一旦数据存储在数据库中,大多数搜索将基于每天,给我今天/1 月 10 日的所有结果。

现在我仍然需要存储时间。因此,如果我将其存储为datetime,则在执行此查询时,sql 将不得不加载整个datetime字段,然后只查看一半的数据。

因此,通过可能将日期存储在其自己的字段中,它可以只查看它需要的内容。

但另一方面,如果您确实在查询中指定了时间,则它现在必须检查两列的值。

因此,我希望 SQL Gurus 提供关于哪个选项对大型数据库的查询具有更好的性能的输入。

据我所知datetime,可以高度优化并且是比分解更好的解决方案。

sql-server t-sql sql-server-2012 datetime date

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

转换 DATETIME 时是否可以更改 CAST/CONVERT 使用的默认样式?

当您尝试在 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 转换为标量值函数。

sql-server cast datetime

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

数据库系统跃升(Postgresql 和 SQL Server)

由于闰秒,这个夜晚会更长: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 到 …

postgresql sql-server datetime

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

MySQL 中“microtime”列的默认值

我的兴趣是用 FSP 为 6 来存储时间。正如我所读到的,这不能用TIMESTAMPorDATETIME数据类型来实现。所以,我有一个double字段来存储microtime函数的输出。

无论如何我可以为这样的字段设置(甚至编写一些代码来创建)默认值吗?

我想使用类似的东西NOW(6)并获取1442059062.065123例如。

mysql timestamp default-value datetime

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

如何在相邻列中显示单独表的查询?

我有两个表 - 一个标题为“计划约束”的表,其中包含“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)

postgresql join datetime sum coalesce

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

日期时间累进求和 PostgreSQL

我的第一个问题在这里,但我查看了许多其他地方并找不到我的问题的答案。

 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)

postgresql aggregate datetime

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

DATEADD 和 DATEPART 以毫秒为单位产生奇怪的结果

我有一个包含 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,等等。

由于这可能会导致某些用户感到沮丧,因此我想了解这种行为并在理想情况下找到问题的解决方案。提前致谢。

sql-server datatypes datetime sql-server-2016

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

计算区间表的集合差

我经常遇到以下问题。我有两张间隔表。它们受日期限制(没有时间部分)。每个表中的间隔不重叠。

开始时间 结束时间
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 作为时间戳。我当前的方法是通过三重自连接(恶心)获取第二个表的补集,然后通过连接将结果与第一个表相交。不好玩。

有更好的方法吗?

sql-server datetime interval sql-server-2019

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

带有 French_CI_AS 排序规则日期转换的 SQL Server

我有一个使用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)

我知道这DATETIME2DATETIME. 但是,这里的两者似乎连解析都不一样。

collation type-conversion datetime localization sql-server-2016

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