从多列创建日期列?

时间:2018-02-03 06:33:05

标签: sql sql-server

如果某个人的出生日期有3列(例如:BirthMonthBirthDayBirthYear),那么将它们合并到一起的最佳方法是什么一列格式为MM/dd/yy且(显然)为date数据类型?谢谢。

3 个答案:

答案 0 :(得分:2)

只需将所有3列合并到YYYY-MM-DD,然后将此字符串转换为Datetime

例如:

Select 
    cast(cast(Year as string) + '-' + 
             cast(Month as string) + '-' +
             cast(Day as string) as datetime)

现在您可以将其格式化为任何日期格式。

答案 1 :(得分:1)

你说“......把它们放在一个格式为MM / dd / yy并且(显然)是日期数据类型的字段中?”但是日期类型没有显示格式。这是一个表达问题。

SQL Server 2012起:

DATEFROMPARTS(year, month, day)

cast((DATEFROMPARTS(year, month, day) as date)转换为纯日期并删除默认时间部分

e.g。

SELECT DATEFROMPARTS(2010, 12, 31) AS Result; 

答案 2 :(得分:1)

对于SQL Server 2012,请使用Mitch建议的DATEFROMPARTS()函数。对于以前的版本:

假设BirthMonthBirthDayBirthYear都是整数值,您可以投射它们:

CAST(CAST(BirthYear AS varchar) + '-' + CAST(BirthMonth AS varchar) + '-' + CAST(BirthDay AS varchar) AS DATETIME)

或者,你可以这样做:

DATEADD(MONTH, BirthMonth - 1, DATEADD(YEAR, BirthYear - 1900, BirthDay - 1));

这样做的好处是不进行任何字符串转换,并且它不依赖于任何日期格式。这利用了SQL Server的日期内部表示是自1900年1月1日以来的天数这一事实。

如果BirthMonthBirthDayBirthYear是有效的字符串值,那么您可以直接转换它们:

CAST(BirthYear + '-' + BirthMonth + '-' + BirthDay AS DATETIME)

如果他们保证月份和日期都有2位数(以及年份的4位或2位数),那么您可以使用更紧凑的方式投射它们而不使用连字符:

CAST(BirthYear + BirthMonth + BirthDay AS DATETIME)