如何从 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) 中的日期组件创建日期?的主要内容,如果未能解决你的问题,请参考以下文章