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