我正在学习SQL Server,并且遇到了这个转换问题。非常感谢任何帮助。
我在SQL Server 2014中有一个表Year_Month_Snap
,其中包含nvarchar
数据类型的数据。
我需要从2016年1月起连续35个月获得该项目的最后一天和一小时。
我看到有许多建议将固定日期拍到YYYY-MM部分,使其成为YYYY-MM-DD部分并将其转换为日期& datetime,但由于每个月的最后一个日期每月变化(可能是30个月或31天或2月28/29天)所以我需要从YYYY-MM计算给定月份的最后日期和小时nvarchar
列中的Year_Month_Snap
数据类型。
当我尝试将其转换为日期/日期时,会抛出以下错误:
Msg 241,Level 16,State 1,Line 25
从字符串转换日期和/或时间时转换失败。
Year_Month_Snap专栏
非常感谢任何帮助!!
答案 0 :(得分:0)
您可以通过向其添加01将年份和月份值转换为DateTime。并添加1个月并减去1小时。
例如,对于2017-10
,您可以通过此获取2017-10-31 23:00:00.000
。
SELECT DATEADD(HOUR,-1,DATEADD(MONTH,1, CONVERT(DATETIME, ('2017-10' + '-01') )))
你的最终查询。
SELECT DATEADD(HOUR,-1,DATEADD(MONTH,1, CONVERT(DATETIME, (Year_Month_Snap + '-01') ))) as LastDayAndHourOfMonth
FROM MyTable
答案 1 :(得分:0)
SQL Server的函数EOMONTH()
可以获取每个月的最后一天。添加一天并减去一小时以获得您需要的东西,然后将其粘贴在递归CTE中,然后离开:)
DECLARE @StartDate DATETIME = N'20160101';
WITH times AS
(
SELECT 1 AS MonthId,
DATEADD(HOUR, -1, DATEADD(DAY, 1, CONVERT(DATETIME, EOMONTH(@StartDate, 0)))) AS MonthEndTime
UNION ALL
SELECT MonthId + 1,
DATEADD(HOUR, -1, DATEADD(DAY, 1, CONVERT(DATETIME, EOMONTH(MonthEndTime, 1)))) AS MonthEndTime
FROM times AS t
WHERE t.MonthId < 35
)
SELECT * FROM times