【问题标题】:Splitting datetime into date/year/month/dayname and count year将日期时间拆分为日期/年/月/日名称并计算年份
【发布时间】:2013-05-09 10:06:57
【问题描述】:

我有问题要使用触发器从日期时间中拆分日期、月份年份、日期名称,当我插入日期时间时,在下一列中将拆分日期、时间、月份年份日期名称和计数年份(要知道该人的年龄我的数据)这可能吗?

例如,如果我插入

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

然后会是这样的

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

【问题讨论】:

  • 您为什么不使用 ISO 8601? “19820406”
  • kk 我知道了,但感谢您记住我的歧义
  • 问题:既然可以使用计算列,为什么还要使用触发器?占用空间少,可以索引....

标签: sql sql-server sql-server-2008 triggers


【解决方案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

【讨论】:

  • 可能是美国:我们不知道。这就是我们使用 ISO 8601 格式来消除这种歧义的原因
  • 不,gbn,我明白了。如果月份成为月份名称,可以吗?例如,第 6 个月,结果将是 6 月
  • @gbn 是的,没错。但是看到他的结果,似乎他正在使用 dmy 格式。无论如何更新我的 ans 使用 ISO 格式
【解决方案2】:

为了正确显示年龄,代码已稍作修改。

    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

谢谢 阿伦

【讨论】:

  • 如何创建触发器来像这样拆分?
  • 您需要在插入实际值的列上创建一个插入后触发器,从插入的表中您也可以在下一列中拆分和更新
【解决方案3】:

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

- 方法一:
您可以在表中添加一些计算列,因此当您检索表内容时,将在该时间计算其他剩余字段。

-- 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

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多