【问题标题】:Combine separate date and time columns into one column将单独的日期和时间列合并为一列
【发布时间】:2013-07-29 14:47:19
【问题描述】:

我有一种情况需要一些建议。没有代码,因为我想自己查找并弄清楚。这只是一个学术问题。

我每天都会得到一个平面文件,我必须将其加载到表格中,这里是文件的 sn-p:

Date-YYYMMDD  TIME
20091124|     01:19:00|...
20091124|     01:19:15|...

这两个字段是日期和时间。当我将此数据加载到数据库中时,结果如下:

Date-YYYMMDD  TIME
20091124      1899-12-30 01:19:00.000
20091124      1899-12-30 01:19:15.000

我有一个将数据与结果合并的视图:

datetime                   yearmonthday
2009-11-24 01:19:00.000    2009-11-24
2009-11-24 01:19:15.000    2009-11-24

我这样做是为了让需要这些数据的人不必胡乱处理应该是日期但不是日期的日期和文本字段。

问题是我不喜欢在视图中这样做。我宁愿把它正确地存储在原始表中。我在想,对于插入的每一行,我都会拦截该插入,进行合并,然后以正确的格式插入到表中。完成后,我可以放下视图。有没有最好的方法呢?像任何优秀的开发人员/管理员一样。我想尽量减少我的干预。我们有电脑来做这类工作。我不控制源文件,也无法对其进行任何更改。我在想一个 on insert 触发器。有没有更好的办法?尽管这几个月我在 TSQL 方面做了很多工作,但在理解好的 TSQL 和最有效的做事方式方面,我仍然认为自己是初学者。

【问题讨论】:

  • 如何将数据加载到数据库中?
  • 这是我继承的一个相当复杂的过程。我已经做得更好了,但它仍然是一个手动过程。 1. 通过电子邮件获取文件(我不是每天都加载。每隔几天加载一次更有意义) 2. 修剪一些标题行并将所有文件合并到一个文件中 3. 将该文件加载到访问数据库中所有数据映射发生的地方 4. 通过 sql importer 将访问表导入到 sql server 这不是一个漫长的过程。我正在等待 SQLServer 2012 在我的环境中可用,然后我将进行迁移,并且使用 sis 包该过程会变得更好。我现在没有那个。
  • 跳过访问。这就是将您的时间值更改为 18991230 而不是 19000101 的原因。
  • 问题在于获取的两个字段是不同的:时间和日期。我必须将它们合并成一个真正的数据时间。由于我的 SSIS 版本,我没有时间字段,我只有数据时间。我听说过“批量插入”,但没有调查过。此外,我正在运行 SSMS 2008R2,因此我在 SQLServer2005 中可以执行的操作受到限制。我无法保存包裹。我只能立即运行东西,我只是打算一瘸一拐地走,直到我有了新的数据库。这应该在本月发生。不过,他们上个月和上个月都这么说。
  • 只是澄清一下,2005 版的集成服务确实支持基于时间的数据类型,DT_DBTIME 这是 2005 年的 SQL Server 数据库不实现时间数据类型.最终,修复您的导入包以在加载过程中将这些值连接到日期时间数据类型中。这是ETLT 部分(提取转换和加载)

标签: tsql sql-server-2005 triggers


【解决方案1】:

我会说加载到临时表中。

CREATE TABLE dbo.StagingTable
(
  Col1 DATETIME,
  Col2 DATETIME
);

将您的数据加载到此表中。如果您的文件与您的问题中的文件一样简单,您应该能够使用BULK INSERT 并省去大部分手动过程。然后在你的 real 表中,有一个 DATETIME 列。

INSERT dbo.RealTable(DateTimeColumn)
  SELECT DATEADD(SECOND, DATEDIFF(SECOND, 0, Col2), Col1)
  FROM dbo.StagingTable;

-- if successful:
TRUNCATE TABLE dbo.StagingTable;

一个更简单的方法是 - 如果您打开文件并修改它们 - 是改变这个:

Date-YYYMMDD  TIME
20091124|     01:19:00|...
20091124|     01:19:15|...

到这里:

Date-YYYMMDD     |...
20091124 01:19:00|...
20091124 01:19:15|...

【讨论】:

  • 所以,你说的是没有触发器并在加载期间修复它。我能做到。我有一个存储过程可以完成很多工作。这是个好主意。有时我只见树木不见森林。另外,我会调查bulk insert。我很快就会有更新。 编辑: 实际上,我只想指出这一点。我可以使该解决方案发挥作用,因为我已经拥有了大部分结构。
猜你喜欢
  • 1970-01-01
  • 2013-11-29
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多