2013-05-09 208 views
1

我通过使用触发器得到了从datetime中分割日期,月份年份,日期名称的问题,插入日期时间时,则在下一列中将拆分日期,时间,月份一年的姓名和数字年(知道我的数据中的男人有多大年纪)是可能的?将日期时间拆分为日期/年/月/日名称和计数年份

例如,如果我插入

INSERT INTO MAN VALUES ('04/06/1982') 

那么会是这样

DATETIME     DATE   MONTH  YEAR  DAYNAME  AGE 
04/06/1982 00:00:00  04   06  1982  friday  27 
+0

为什么不使用ISO 8601? “19820406” – gbn 2013-05-09 10:17:55

+0

kk我得到了这个,但是谢谢关于歧义的记忆 – oebanez 2013-05-09 10:28:30

+0

问题:为什么在使用计算列时使用触发器?占用较少的空间,可以编入索引.... – 2013-05-09 10:53:42

回答

1

试试这个: -

Declare @myDate datetime 
set @myDate='19820604' --YYYYMMDD 


Select @myDate as DateTime, 
     datename(day,@myDate) as Date, 
     month(@myDate) as Month, 
     datename(year,@myDate) as Year, 
     Datename(weekday,@myDate) as DayName, 
     DATEDIFF (year , @myDate , getdate()) as Age 

结果

╔══════════════════════════════╦══════╦═══════╦══════╦═════════╦══════════╗ 
    ║   DateTime   ║ DATE ║ MONTH ║ YEAR ║ DAYNAME ║ Age  ║ 
    ╠══════════════════════════════╬══════╬═══════╬══════╬═════════╬══════════╣ 
    ║ April, 06 1982 00:00:00+0000 ║ 4 ║  6 ║ 1982 ║ Friday ║  31 ║ 
    ╚══════════════════════════════╩══════╩═══════╩══════╩═════════╩══════════╝ 

SQL小提琴Demo

+0

这个假设为美国的mm/dd/yyy格式。我认为这是6月4日。 – gbn 2013-05-09 10:17:25

+0

@gbn:我已将格式更改为dmy now – praveen 2013-05-09 10:18:21

+0

虽然它可能是美国的:我们不知道。这就是为什么我们有ISO 8601格式来消除这种歧义 – gbn 2013-05-09 10:19:04

0

该代码已被轻微改变,以正确给予年龄。

Select myDate,myDateDate,myDateMonth,myDateYear,myDateDayName, Convert(varchar(50),Age)+ ' Years and '+Convert(varchar(50),nodays) +'days' {Age] from 
     (
     Select @myDate as myDate, 
       datename(day,@myDate) as myDateDate, 
       month(@myDate) as myDateMonth, 
       datename(year,@myDate) as myDateYear, 
       Datename(weekday,@myDate) as myDateDayName, 
       DATEDIFF (year , @myDate , getdate()) Age , 
       DATEDIFF  (dd , @myDate , getdate()) -365* DATEDIFF (year , @myDate , getdate()) as nodays 
     ) As a 

感谢 阿伦

+0

如何创建触发器像这样分裂? – oebanez 2013-05-09 13:38:36

+0

您需要在插入实际值的列上创建一个after插入触发器,从插入的表中还可以在下一列中拆分和更新 – 2013-05-14 06:49:30

0

这里有解决问题的两种方法:

-方法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 
相关问题