我已经从datameer导入了一个日历表到我的sql server数据库。我对SQL很新,所以我对convert函数没有最好的理解。我有一个包含5列的日历表(cal_month,cal_year,Toronto,Montreal,National_Avg)。数据类型是(nvarchar,nvarchar,numeric,numeric,float)。
表格中的一行示例如下:
Month | Year | Toronto | Montreal | National Average
---------+------+---------+----------+------------------
January | 2018 | 20 | 21 | 20.5
下面是我对转换函数的尝试,我的查询应该识别当前月份,并且-1来获取上个月的全国平均值,所以在这种情况下它将是2018年2月。
select convert(date, cal_month), convert(date,cal_year), National_Avg
from dbo.CALENDAR
where month(cal_month) = month(dateadd(month,-1,current_timestamp))
and year(cal_year) = year(dateadd(month,-1,current_timestamp))
我收到的错误是:
Conversion failed when converting date and/or time from character string.
答案 0 :(得分:1)
您不需要操纵表格中的数据。您只需操纵搜索参数current_timestamp
即可适应数据的数据类型。
SELECT cal_month, cal_year, National_Avg
FROM dbo.CALENDAR
WHERE cal_month = DATENAME(mm, DATEADD(month,-1,current_timestamp))
AND cal_year = DATENAME(yyyy, DATEADD(month,-1,current_timestamp))
答案 1 :(得分:-1)
问题可能是您尝试将月/年整数转换为日期。
尝试:
SELECT DATEADD(month, cal_month -1, DATEADD(year, cal_year-1900, 0))
from dbo.CALENDAR
或者,如果您需要从今天起获得月/年,请尝试
DECLARE @oneMonthAgo datetime
SET @oneMonthAgo = DATEADD(MONTH, -1, CURRENT_TIMESTAMP)
DECLARE @cal_month int
SET @cal_month = MONTH(@oneMonthAgo)
DECLARE @cal_year int
SET @cal_year = YEAR(@oneMonthAgo)
SELECT National_Avg
FROM dbo.CALENDAR
WHERE cal_year = @cal_year AND cal_month = @cal_month
啊,只是注意到你使用月份名称 - 这是愚蠢的,但无论如何:
DECLARE @cal_month nvarchar(200)
SET @cal_month = DATENAME(month, @oneMonthAgo)
其他一切都保持不变。
或者您可以将计算列添加到日历表中:
ALTER TABLE dbo.Calendar ADD MonthNum AS
CASE Month
WHEN 'January' THEN 1
WHEN 'February' THEN 2
WHEN 'March' THEN 3
WHEN 'April' THEN 4
WHEN 'May' THEN 5
WHEN 'June' THEN 6
WHEN 'July' THEN 7
WHEN 'August' THEN 8
WHEN 'September' THEN 9
WHEN 'October' THEN 10
WHEN 'November' THEN 11
WHEN 'December' THEN 12
END PERSISTED
这样,您可以更快地进行查找,如整数。
随着桌子的填充和变大,这将派上用场。