我在sql server db中有一个表,它有一个带有日期时间数据的'nvarchar'数据类型列。
我想在表中添加两个列,一个以'datetime'数据类型的整个日期时间数据,另一个列应该只有'datetime'数据类型的日期
表格中有大约500万行。
nvarchar数据如下所示:2013-03-20 00:00:50
如果有人能帮助我使用sql命令来帮助我,我真诚地感激。
由于
答案 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));