如何使用convert function sql(String to Date)

时间:2018-03-19 13:23:14

标签: sql sql-server type-conversion sqldatatypes

我已经从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.

2 个答案:

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

这样,您可以更快地进行查找,如整数。
随着桌子的填充和变大,这将派上用场。