【问题标题】:How to create dates from date components in SQL (T-SQL)?如何从 SQL (T-SQL) 中的日期组件创建日期?
【发布时间】:2011-04-24 19:54:34
【问题描述】:

如何在 SQL (T-SQL) 中构造原生日期数据类型值?

我添加了一些示例,但请提供您自己的示例。我的示例假设月份和年份作为整数值存储(或随时可用),但 您的 示例可能会假设日期和月份(或其他)存储为文本。我看不到未来;让我吃惊。

【问题讨论】:

  • 还有其他问题实际上与此相同,但为了为真正相同的问题的不同措辞提供尽可能多的搜索结果,我创建了这个问题(而不是像我最初开始那样编辑另一个问题的标题)。

标签: sql tsql


【解决方案1】:
SELECT DATEFROMPARTS(@Year, @Month, @Day)

(From SQL Server 2012)

【讨论】:

  • @Augustas - 答案只包含两行。其中一个声明(From SQL Server 2012),所以我认为这很清楚......
  • 好的,但您可能会在 29/02 获得例外。我正在使用 DATEADD(DAY, @ Day - 1,DATEFROMPARTS(@ Year, @month, 1))
  • @ČikićNenad 是的,如果你也传入(2009,13,1)(2009,1,32),你会得到一个例外。您需要传入使日期有效的值。如果您对代码的某些问题有疑问,请提出一个新问题。
【解决方案2】:

为什么,将输入数据作为字符串,最明显(因此不足为奇,抱歉)的解决方案之一是:

SELECT
  mydate = CAST([year] + RIGHT('0' + [month], 2) + '01' AS datetime)
                                           /* or 'AS date' in SQL Server 2008+ */
FROM (
  SELECT [month] = '2',  [year] = '2011' UNION ALL
  SELECT [month] = '03', [year] = '2011' UNION ALL
  SELECT [month] = '5',  [year] = '2011' UNION ALL
  SELECT [month] = '12', [year] = '2011' UNION ALL
  SELECT [month] = '8',  [year] = '2084' UNION ALL
  SELECT [month] = '1',  [year] = '1940'
) x;

【讨论】:

  • 这只是编程算法(即程序员)的缓存策略!
  • +1 关键是 T-SQL 将始终正确转换 'yyyymmdd' 形式的字符串......无论您使用什么作为自定义日期格式。 (当然假设字符串是一个有效的日期。)
  • 为了“接受我所有问题的答案”,我选择了这个作为“获胜者”。恭喜!
【解决方案3】:

以下代码显示了如何从年和月(整数)值创建日期值:

SELECT  DATEADD(
            month,
            DATEDIFF( month, 0, GETDATE() )
                + x.[month]
                - MONTH( GETDATE() ),
            DATEADD(
                year,
                DATEDIFF( year, 0, GETDATE() )
                    + x.[year]
                    - YEAR( GETDATE() ),
                0 ) )
FROM (  SELECT [month] = 2, [year] = 2011
        UNION ALL
        SELECT [month] = 3, [year] = 2011
    ) x;

【讨论】:

    【解决方案4】:

    来自年、月和日(整数)值的日期值,但也许应该首先对输入进行清理:

    SELECT  DATEADD(
                day,
                x.[day] - DAY(0),
                DATEADD(
                    month,
                    x.[month] - MONTH(0),
                    DATEADD(
                        year,
                        x.[year] - YEAR(0),
                        0 ) ) )
    FROM (  SELECT [month] = 2, [year] = 2011, [day] = 14
            UNION ALL
            SELECT [month] = 3, [year] = 2011, [day] = 2
            UNION ALL
            SELECT [month] = 5, [year] = 2011, [day] = 1
            UNION ALL
            SELECT [month] = 7, [year] = 2011, [day] = 0
            UNION ALL
            SELECT [month] = 8, [year] = 2084, [day] = 40
            UNION ALL
            SELECT [month] = 1, [year] = 1940, [day] = -6
        ) x;
    

    【讨论】:

      【解决方案5】:

      更多示例代码用于从年份和月份(整数)值创建日期值,但比其他一些示例代码更简单:

      SELECT  DATEADD(
                  month,
                  x.[month] - MONTH(0),
                  DATEADD(
                      year,
                      x.[year] - YEAR(0),
                      0 ) )
      FROM (  SELECT [month] = 2, [year] = 2011
              UNION ALL
              SELECT [month] = 3, [year] = 2011
              UNION ALL
              SELECT [month] = 5, [year] = 2011
              UNION ALL
              SELECT [month] = 7, [year] = 2011
              UNION ALL
              SELECT [month] = 8, [year] = 2084
              UNION ALL
              SELECT [month] = 1, [year] = 1940
          ) x;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-12
        • 2020-08-01
        • 2015-05-19
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        • 2017-11-16
        • 1970-01-01
        相关资源
        最近更新 更多