这里有两种解决问题的方法:
- 方法 1:
您可以在表中添加一些计算列,因此当您检索表内容时,将在该时间计算其他剩余字段。
-- 1.1) Create the base of table 'MAN'
CREATE TABLE [dbo].[MAN](
    [DATETIME] [datetime] NOT NULL
) ON [PRIMARY]
GO
-- 1.2) Insert a record in it
INSERT INTO MAN VALUES ('04/06/1982')
GO
-- 1.3) Add some computed columns
ALTER TABLE MAN
ADD
    [DAY]       AS DATENAME(DAY, [DATETIME]),
    [MONTH]     AS MONTH([DATETIME]),
    [YEAR]      AS DATENAME(YEAR, [DATETIME]),
    [DAYNAME]   AS DATENAME(WEEKDAY, [DATETIME]),
    [AGE]       AS DATEDIFF(YEAR, [DATETIME], GETDATE())
GO
-- 1.4) See the result
SELECT * FROM MAN
- 方法 2:
在创建表时,添加所需的剩余字段,以便在下一阶段添加插入/更新触发器以计算剩余字段并插入/更新它们。
-- 2.1) Create the table 'MAN' with all needed columns
CREATE TABLE [dbo].[MAN](
    [DATETIME]  [datetime]      NOT NULL,
    [DAY]       [int]           NULL,
    [MONTH]     [int]           NULL,
    [YEAR]      [int]           NULL,
    [DAYNAME]   [nvarchar](10)  NULL,
    [AGE]       [int]           NULL
) ON [PRIMARY]
GO
-- 2.2) Create Insert and update triggers in order to calculate the values of the rest fields while inserting/updating
CREATE TRIGGER [dbo].[trCalculateRemainingDateFields] ON MAN
AFTER INSERT, UPDATE
AS
BEGIN   
    SET NOCOUNT ON;
    UPDATE  MAN
    SET
        [DAY]       = DATENAME(DAY, MAN.[DATETIME]),
        [MONTH]     = MONTH(MAN.[DATETIME]),
        [YEAR]      = DATENAME(YEAR, MAN.[DATETIME]),
        [DAYNAME]   = DATENAME(WEEKDAY, MAN.[DATETIME]),
        [AGE]       = DATEDIFF(YEAR, MAN.[DATETIME], GETDATE())
    FROM    Inserted i
    WHERE   i.[DATETIME] = MAN.[DATETIME]
END
GO
-- 2.3) Insert a record in it
INSERT INTO MAN ([DATETIME]) VALUES ('04/06/1985')
GO
-- 2.4) See the result
SELECT * FROM MAN
- 方法 3:
创建计算剩余字段的主表视图可能是一个不错的选择。
-- 3.1) Create the base of table 'MAN'
CREATE TABLE [dbo].[MAN](
    [DATETIME] [datetime] NOT NULL
) ON [PRIMARY]
GO
-- 3.2) Insert a record in it
INSERT INTO MAN VALUES ('04/06/1982')
GO
-- 3.3) Create a view which is contained the remaining fields
CREATE VIEW dbo.vMAN
AS
    SELECT  [DATETIME],
            DATENAME(DAY, [DATETIME])               AS [DAY],
            MONTH([DATETIME])                       AS [MONTH],
            DATENAME(YEAR, [DATETIME])              AS [YEAR],
            DATENAME(WEEKDAY, [DATETIME])           AS [DAYNAME],
            DATEDIFF(YEAR, [DATETIME], GETDATE())   AS [AGE]    
    FROM    MAN
GO
-- 3.4) See the result
SELECT * FROM vMAN