【问题标题】:How to design a table having age which returns current age of that person when queried after two years in SQL Server?如何设计一个具有年龄的表,该表在 SQL Server 中两年后查询时返回该人的当前年龄?
【发布时间】:2020-11-05 06:17:41
【问题描述】:

我想设计一个如下表,两年后查询时返回一个人的当前年龄。

CREATE TABLE Person 
(
    Person_ID INT IDENTITY(1,1) NOT NULL,
    Initial VARCHAR(50) NULL,
    Surname VARCHAR(100) NOT NULL,
    Age INT NOT NULL
)

例如表格有 2 行

 Person_ID  Initial Surname Age
 -------------------------------
    1        AR     Rahman  40
    2        M      Jackson 50

两年后的选择查询

select age 
from Person 
where person_ID = 1 

它应该返回 42

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • “两年后查询时返回该人的当前年龄”不清楚。你想要select age+2 as age吗?使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。描述结果:说足够多的人可以离开并带着解决方案回来。 PS这将是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。

标签: sql-server database-design auto-increment


【解决方案1】:

在您的表中将出生日期存储为 DATE 并使用 computed column 而不使用 persisted 关键字,因为年龄计算是非确定性,如图所示在下面的代码中。

CREATE TABLE #Person
(
    Person_ID INT IDENTITY(1,1) NOT NULL,
    Initial VARCHAR(50) NULL,
    Surname VARCHAR(100) NOT NULL,
    DOB DATE NULL,
    Age AS DATEDIFF(YEAR,DOB,getdate())  
)

INSERT INTO #Person
SELECT 'Gyan','Prakash','26-feb-1994'

SELECT * FROM #Person

【讨论】:

    【解决方案2】:

    您应该在表格中存储出生日期并始终计算年龄。
    为此,您可以使用计算列,或者您需要在查询本身中包含计算。

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2015-05-22
      • 2011-03-23
      • 2010-10-01
      • 2022-11-23
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多