代码如下:
create function change_date(@date datetime,@separator nvarchar(2)='::')
returns nvarchar(20)
begin
declare @retunstring nvarchar(20)
set @retunstring='今天是:'+convert(nvarchar(5),year(@date))+'年'+@separator
+convert(nvarchar(5),month(@date))+'月'+@separator
+convert(nvarchar(5),day(@date))+'日'
return @retunstring
end调用该函数的代码如下:
use TeachingManageSYS 
go
select dbo.change_date(1652-1-1,'::')
go但是执行结果为:
今天是:1904年::7月::9日不知道代码哪里出了问题,请高手指点

解决方案 »

  1.   

    select dbo.change_date('1652-1-1','::')引号少了
      

  2.   

    不加引号=整数转日期
    select cast(1652-1-1 as DATEtime)
      

  3.   


    create function change_date(@date datetime2,@separator nvarchar(2)='::')
    returns nvarchar(20)
    begin
    declare @retunstring nvarchar(20)
    set @retunstring='今天是:'+convert(nvarchar(5),year(@date))+'年'+@separator
    +convert(nvarchar(5),month(@date))+'月'+@separator
    +convert(nvarchar(5),day(@date))+'日'
    return @retunstring
    end;select dbo.change_date(convert(datetime2,'1652-01-01',120),'::');
      

  4.   

    DATETIME数据类型存储把日期和时间部分作为一个单列值在一起存储,该数据类型支持日期从1753年1月1日到9999年12月31日,时间部分的精确度是3.33毫秒,它需要8字节的存储空间。SMALLDATETIME数据类型比起DATETIME类型来说需要更少的存储空间,只有4字节,但是支持更小的日期和时间范围。SMALLDATETIME只支持日期从1900年1月1日到2079年6月6日,时间部分只能够精确到分钟。DATETIME2数据类型是对DATETIME数据类型的一个扩展,该新的数据类型扩展了可以接受日期的范围和在日期/时间值的时间部分添加附加精度。DATETIME2列支持日期从0001-01-01到9999-01-01。扩大的日期范围现在允许你存储更早的日期而无需使用一些创造性的编码算法。 DATETIME2中的时间部分的精确度依赖于你如何定义DATETIME2列,时间部分能够存储一个只有小时、分钟和秒的时间值,或者它能够支持在不同的精确定存储微秒,最多有7位小数,微妙可以向下精确到100纳秒
      

  5.   

    select dbo.change_date('1652-1-1','::')
      

  6.   

    可是出现了这样的错误:从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。
      

  7.   

    格式不滿足當前環境的日期格式SET DATEFORMAT YMD;--加上...SQL
      

  8.   

    加上 SET DATEFORMAT YMD 就对了问题解决了 谢谢你们