【问题标题】:SQL create a datetime from year and number fieldsSQL 从年份和数字字段创建日期时间
【发布时间】:2012-07-12 15:33:57
【问题描述】:

我在一个视图中有两列可以给我日期部分。

它们是月份和年份。

我需要一个新列,它是一个日期/时间字段。它必须是其他两列提供的月份和年份的第一天。

4, 2011需要是

2011-04-01 00:00:00.000

在新列中

当前设置如下所示:

month_number    incident_year
4   2011
5   2011
6   2011
7   2011
8   2011
9   2011
10  2011
11  2011
12  2011
1   2012
2   2012
3   2012
4   2012
5   2012
6   2012

【问题讨论】:

  • 您只需要该列作为查询的输出,对吗?还是您想在视图中添加一个新列?

标签: sql sql-server sql-server-2008 reporting-services ssrs-2008


【解决方案1】:
SELECT 
  incident_year, month_number,
  dt = DATEADD(MONTH, (incident_year-1900)*12+month_number-1, '19000101') 
  FROM dbo.view_name;

您还可以使用 0-date 来减少冗长:

SELECT 
  incident_year, month_number,
  dt = DATEADD(MONTH, (incident_year-1900)*12+month_number-1, 0) 
  FROM dbo.view_name;

在 SQL Server 2012 中,您将能够更简单地做到这一点:

SELECT DATEFROMPARTS(incident_year, month_number, 1)
  FROM dbo.view_name;

【讨论】:

    【解决方案2】:
     Select CAST(CAST( incident_year AS varchar(4)) + '-' + 
            CAST(month_number AS varchar(2)) + '-01' AS DATETIME) as incident_Year
     from YourView
    

    【讨论】:

    • 是的,这行不通:CAST(month_number AS varchar) 将返回 '4',而不是 '04'
    • @X-Zero 默认设置实际上不需要前导零(尽管我不确定所有语言或日期格式设置)。也正如(现已删除)评论所述:stop declaring varchar without length. Please.
    • @X-Zero 我怀疑。即使添加 4 也会返回 04
    • @AaronBertrand : 我的错误更新了我的答案!
    【解决方案3】:
    Alter table yourTable add newDateColumn datetime NULL
    
    update yourTable set newDateColumn = 
       CONVERT(datetime, CAST(incident_year as varchar(4)) +'-' CAST(month_number as varchar(2))+'-01 00:00:00.000', varchar(30)) 
       from YourTable
    

    【讨论】:

      猜你喜欢
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多