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

时间:2017-12-07 04:44:44

标签: tsql sql-server-2014 date-conversion string-to-datetime

我正在学习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专栏

非常感谢任何帮助!!

2 个答案:

答案 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