使用来自同一个表的转换数据在sql server中添加列

时间:2014-10-13 07:27:14

标签: sql sql-server

我在sql server db中有一个表,它有一个带有日期时间数据的'nvarchar'数据类型列。

我想在表中添加两个列,一个以'datetime'数据类型的整个日期时间数据,另一个列应该只有'datetime'数据类型的日期

表格中有大约500万行。

nvarchar数据如下所示:2013-03-20 00:00:50

如果有人能帮助我使用sql命令来帮助我,我真诚地感激。

由于

4 个答案:

答案 0 :(得分:2)

试试这个:

update table x
set dateColumnWithTime = cast(MyVarcharDate as datetime), 
    datecolumnWithoutTime = DATEADD(Day, DATEDIFF(Day, 0, cast(MyVarcharDate as datetime)), 0)  

输出:

dateColumnWithTime      datecolumnWithoutTime
----------------------- -----------------------
2013-03-20 00:00:50.000 2013-03-20 00:00:00.000

答案 1 :(得分:0)

您需要做的是首先更改表格,然后更新它。

ALTER TABLE YOUR_TABLE ADD DATETIME_COL DATETIME
ALTER TABLE YOUR_TABLE ADD DATE_COL DATE

UPDATE YOUR_TABLE 
SET 
  DATE_COL = CAST(NVCHAR_DATE AS DATE), 
  DATETIME_COL = CAST(NVCHAR_DATE AS DATETIME)

但是,将日期存储为单独的列似乎有点多余。也许计算列是更好的选择:

ALTER TABLE YOUR_TABLE ADD COMNPUTED_DATE_COL AS CAST(DATETIME_COL AS DATE)

请参阅此SQL Fiddle

答案 2 :(得分:0)

首先将datetime类型存储为nvarchar是错误的。而不是将数据存储为两个以上的列;您从nvarchar列中获取数据并按照下面的方式显示相应的数据,这样就可以避免在5M行上执行update

SELECT CAST(nvarchar_column as DATETIME) as datetime_col,
CAST(nvarchar_column as DATE) as date_col
from my_5m_rows_table

答案 3 :(得分:0)

首先,请注意在三列中保存相同的日期/时间会引入相当多的冗余,这就是我的下面建议使用计算列的原因:日期/时间只存储一次,即最多的位置适当的(在新创建的DateTimeColumn DATETIME2中)。所有其他列都定义为计算列,基于此。

-- create new column that will hold the date/time. note: if your version of SQL 
-- Server supports DATETIME2, you should use this type instead of DATEIME
ALTER TABLE t
ADD DateTimeColumn DATETIME2 NULL;

-- populate the new column by converting the values of the existing VARCHAR column
UPDATE t
SET DateTimeColumn = CONVERT(DATETIME2, VarCharColumn);

-- recreate the VARCHAR column as a computed column
ALTER TABLE t 
DROP COLUMN VarCharColumn;

ALTER TABLE t
ADD COLUMN VarCharColumn AS (CONVERT(NVARCHAR, DateTimeColumn));

-- create the DATE column as a computed column (again, no need to save the date
-- redundantly)
ALTER TABLE t
ADD COLUMN DateColumn AS (CONVERT(DATE, DateTimeColumn));