如何从 SQL (T-SQL) 中的日期组件创建日期?

Posted

技术标签:

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

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

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

【问题讨论】:

还有其他问题实际上与此相同,但为了为真正相同的问题的不同措辞提供尽可能多的搜索结果,我创建了这个问题(而不是像我最初开始那样编辑另一个问题的标题)。 【参考方案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;

【讨论】:

以上是关于如何从 SQL (T-SQL) 中的日期组件创建日期?的主要内容,如果未能解决你的问题,请参考以下文章

返回财政年度的第一天(4 月 1 日)T-SQL

从其他日期时间范围(T-SQL)中减去日期时间范围

从 T-SQL 中的周数获取日期

从T-SQL中的周数中获取日期

T-SQL 识别损坏的日期序列中的间隙

如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙