2

我正在学习 SQL Server 并被困在这个转换问题上。任何帮助是极大的赞赏。

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

我需要从 2016 年 1 月开始连续 35 个月获取月末的最后一天和最后一小时。

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

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

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

Year_Month_Snap 列

任何帮助是极大的赞赏!!

4

2 回答 2

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
于 2017-12-07T06:10:53.833 回答
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
于 2017-12-07T08:07:02.007 回答