计算SQL Server 2014中的Year_Month_SNAP字符串的一天的最后一天和小时



我正在学习SQL Server,并且陷入了此转换问题。任何帮助都非常感谢。

我在SQL Server 2014中有一个表,其中包含nvarchar数据类型中的数据的列Year_Month_Snap

我需要从2016年1月起连续35个月获得本月的最后一天和小时。

我看到有许多建议将固定的一天捕捉到Yyyy-MM部分,以使其成为Yyyy-MM-DD部分,并将其转换为日期&DateTime,但是自每个月的最后一个日期都不同(可能是30天或31天或2月28/29天),所以我需要计算给定月份的最后一个日期和小时与Yyyy-MMnvarchar Year_Month_Snap列中的数据类型。

当我尝试将其转换为日期/日期时间时,它会引发以下错误:

msg 241,第16级,状态1,第25行
转换日期和/或从字符串转换时间时失败。

year_month_snap列

任何帮助将不胜感激!

您可以通过向其添加01将年度和月值转换为日期时间。并添加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

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

最新更新