将单独的日期和时间列合并为一列

时间:2013-07-29 17:27:14

标签: tsql sql-server-2005 triggers

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

我每天都得到一个平面文件,我必须加载到表中这里是该文件的片段:

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 个答案:

答案 0 :(得分:2)

我想说加载到临时表。

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

将数据加载到此表中。如果您的文件与问题中的文件一样简单,那么您应该可以使用BULK INSERT并删除大部分手动过程。然后在真实表格中,有一个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|...