Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从SQL(T-SQL)中的日期组件创建日期?_Sql_Tsql - Fatal编程技术网

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

如何从SQL(T-SQL)中的日期组件创建日期?,sql,tsql,Sql,Tsql,如何在SQL(T-SQL)中构造本机日期数据类型值 我已经添加了一些示例,但请提供您自己的示例。我的示例假设月份和年份存储为整数值(或随时可用),但您的示例可能会假设日期和月份(或其他)存储为文本。我看不到未来;让我吃惊。以下代码显示了如何从年和月(整数)值创建日期值: 更多示例代码用于从年和月(整数)值创建日期值,但比其他一些示例代码更简单: SELECT DATEADD( month, x.[month] - MONTH(0),

如何在SQL(T-SQL)中构造本机日期数据类型值


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

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


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

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;

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

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;

年、月和日(整数)值中的日期值,但可能应首先清除输入:

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;

()

还有其他问题与此完全相同,但为了为同一问题的不同措辞提供尽可能多的搜索结果,我创建了这个问题(而不是像我最初开始编辑另一个问题的标题)。这只是编程算法的缓存策略(即程序员)!+1要点是T-SQL始终会正确转换格式为“yyyymmdd”的字符串……无论您使用何种自定义日期格式。(当然,假设字符串是有效日期。)为了让我所有的问题都能“接受答案”,我选择了这个作为“赢家”。祝贺你!@Augustas-答案只包含两行。其中一行写着
(来自SQL Server 2012)
,所以我认为这很清楚……好吧,但你可能会在29/02时遇到例外。我使用的是DATEADD(DAY,@DAY-1,DATEFROMPARTS)(@Year,@month,1))@ČikićNenad是的,如果您同时传入
(2009,13,1)
(2009,1,32)
,您会得到一个异常。您需要传入一个有效日期的值。如果您对代码的某些问题有疑问,请提出新问题。
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;
SELECT DATEFROMPARTS(@Year, @Month, @Day)