【问题标题】:SQL Server: convert string 'n', 'hh', 'd' to global variables n, hh and dSQL Server:将字符串 'n'、'hh'、'd' 转换为全局变量 n、hh 和 d
【发布时间】:2016-12-27 08:18:49
【问题描述】:

我们使用了一个非常高级的框架,称为 Instant Developer,其中日期部分被实现为字符串。为了实现一个接口,我将来自 SQL Server 的函数 DATEADD (datepart , number , date ) 添加到我的项目库中。但是当我调用它时,生成的代码例如是

SELECT dateadd('n',90,CONVERT(datetime, DATEREQUEST+TIMEREQUEST))
FROM [Ergo].[dbo].[MANUTENZIONI]
where TICKETMANUTE = 17723

但 SQL Server 引发 ax 异常,因为dateadd() 函数的第一个参数不正确,因为它不应该是字符串而是全局变量。有没有办法转换它?比如:

dateadd(case when 'n'='n' then n end, 90, CONVERT(datetime, DATEREQUEST+TIMEREQUEST))

【问题讨论】:

  • 为什么不能生成dateadd(n,90,CONVERT(datetime, DATEREQUEST+TIMEREQUEST))
  • 作为一种解决方法,创建包装函数dateadd_N(int,datetime),dateadd_D(int,datetime), ...
  • 因为我的框架不允许我...正如我所写的,日期部分被实现为字符串。所以如果我打电话给dateAdd(Minutes,90,date),那么 Minutes 会被翻译成 'n'...
  • @Serg:这正是我所做的......我只是想拥有一个独特的功能,因为我已经拥有太多的功能......
  • 或者创建MyDateadd(varchar(5),int,datetime),它检查第一个参数并返回正确的dateadd

标签: sql sql-server date datetime dateadd


【解决方案1】:

创建一个接受 varchar 作为区间类型的包装函数

create function myDateadd(@type varchar(5), @amount int, @dt datetime)
returns datetime
as
begin
return case @type
       when 'n' then dateadd(n, @amount, @dt)
       when 'd' then dateadd(d, @amount, @dt)
       -- ...
       end;
end
go

select dbo.myDateadd('n',60,getdate());

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 2018-04-17
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多