【问题标题】:Combine 2 String Columns Like Year and Month to a Date Format Column将 2 个字符串列(如年和月)合并为日期格式列
【发布时间】:2020-05-15 12:17:53
【问题描述】:

我更新了预期的日期格式。由于没有日期列,它将添加每个月的可用最后一天。例如,7 月有 31 天,则将 31 天添加到 7 月,如 2012-07-31;六月有30天,会变成2012-06-30。

我在 SQL Server 中有一个数据集。年和月是 2 个单独的列。它们都是字符串。

Year  Month
2012    7
2010    6
2009    1
2009    3
2018    10

如何将它们组合成一个新的日期格式列,例如:

Year  Month   Date
2012    7    2012-07-31 00:00:000
2010    6    2010-06-30 00:00:000
2009    1    2009-01-31 00:00:000
2009    3    2009-03-31 00:00:000
2018    10   2018-10-31 00:00:000

我尝试了几种方法,但不断收到错误:

从字符串转换日期和/或时间时转换失败。

【问题讨论】:

  • 请添加您的几种方式
  • 2012-07 不是日期
  • @GMB 对不起。我不知道 2012-07 不是日期。我已经在我的问题中纠正了这一点。其实,我想得到 2012-07-31 00:00:000

标签: sql sql-server string tsql date


【解决方案1】:

如果您希望生成一个新的 string 来连接数字年份和月份,您可以使用字符串函数:

concat(year, '-', case when len(month) = 1 then '0' end, month)

case 表达式左边用0 填充月份,当它只有一位数字时。


现在问题已被编辑,您似乎想要该月的最后一天。如果是这样,您可以使用datefromparts() 生成代表该月第一天的日期,并使用eomonth() 获取该月的最后一天:

eomonth(datefromparts(year, month, 1))

如果你真的想要一个日期时间而不是日期:

cast(eomonth(datefromparts(year, month, 1)) as datetime)

Demo on DB Fiddle

年份 |月 |月底 ---: | ----: | :------------------------ 2012 | 7 | 2012-07-31 00:00:00.000 2010 | 6 | 2010-06-30 00:00:00.000 2009 | 1 | 2009-01-31 00:00:00.000 2009 | 3 | 2009-03-31 00:00:00.000 2018 | 10 | 2018-10-31 00:00:00.000

【讨论】:

    【解决方案2】:

    你可以使用datefromparts()构造一个日期:

    select datefromparts(year, month, 1)
    

    然后,您必须将日期格式化为字符串,以获取 yyyy-mm 格式。

    如果您想要具有该格式的列,请使用以下选项之一:

    select concat(year, '-', right('0' + month, 2))
    

    或: 选择年 * 100 + 月

    取决于基列是字符串还是数字。

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 1970-01-01
      • 2015-11-22
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2015-04-29
      相关资源
      最近更新 更多