【问题标题】:SQL Server: save formulas in tableSQL Server:将公式保存在表中
【发布时间】:2014-04-27 17:52:41
【问题描述】:

有没有办法在 SQL 表中保存如下公式?

-- first Monday in @month of current year
dateadd(d, datediff(d, 0, dateadd(m, @month-1, 
  dateadd(yy, datediff(yy, 0, getdate()), 6)))/7*7, 0),
-- last Monday in @month of current year
dateadd(d, datediff(d, 0, dateadd(m, @month, 
  dateadd(yy, datediff(yy, 0, getdate()), 6)))/7*7, -7),
-- third Friday in @month of current year
dateadd(d, datediff(d, 0, dateadd(m, @month-1, 
  dateadd(yy, datediff(yy, 0, getdate()), 3)))/7*7, 18)

我有一个包含多个国家/地区的表格,需要为每个国家/地区保存可变日期,如下例所示。 这些日期是简单的日期计算,例如总是五月的第一个星期一等。 因此,我试图找到处理日期值每年都在变化的此类事情的最佳方法——大约 30 个国家/地区中的每个国家/地区都需要 5 到 10 个日期。

我对 SQL 还很陌生,所以这更多的是要找出处理此类问题的选项。

非常感谢 Mike 对此提供的任何帮助和建议。

【问题讨论】:

  • 您是否尝试将公式存储为文本,然后稍后再执行?
  • 不太确定您在寻找什么,但您可能想考虑创建一个 view w3schools.com/sql/sql_view.asp
  • 安迪:是的,这就是我所希望的。我刚刚更新了我的帖子,因为这更多地是为了了解处理此类事情的选项。理想情况下,我希望避免在我的页面上的存储过程或 PHP 中包含 30 个 case 语句的列表,因此我尝试以这种方式对其进行排序。
  • 我认为存储过程中的 30 个 CASE 语句比将此函数作为字符串保存在数据库中更好
  • @M.Ali:谢谢。所以这将类似于 PHP 中的 Switch 语句?这在 SQL 中是否存在?如果我的列表增加到 50 个或更多,会有任何(性能)​​问题吗?

标签: sql sql-server dynamic calculated-columns


【解决方案1】:

评论有点长。视图绝对是您可以做的一件事。但是,我认为计算列是一种更好的方法(文档是 here)。

在 SQL Server 中,您可以将计算方向放入表定义中。一种方法是在create table 语句中。另一个正在使用alter table

alter table add FirstMondayOfCurrentYear as
    dateadd(d, datediff(d, 0, dateadd(m, @month-1, dateadd(yy, datediff(yy, 0, getdate()), 6)))/7*7, 0);

您需要弄清楚@month 指的是什么。定义不能使用变量——但你绝对可以得到当年的第一个星期一而不使用变量。

您可以添加任意数量的内容(好吧,可能有一些限制,但我认为您不会达到目标)。

计算列的一个非常强大的特性是您可以在它们上构建索引,并且这些索引会随着数据随时间的变化而保持不变。很方便。

请注意,它们是在使用时计算的,因此这可能会带来一些额外的开销。这通常是一个很小的代价。

【讨论】:

  • 非常感谢,戈登 - 这非常有帮助!为了理解这一点,假设我需要以这种方式计算 30 个不同的日期,这是否意味着我需要添加 30 列或者我可以在同一列中存储不同的公式?
【解决方案2】:

查看sp_executesql。它允许您获取动态 SQL 字符串——包括参数! ——并执行它们。与预编译的 SQL 语句相比,它有点慢,但如果您不追求速度,它肯定会给您想要的灵活性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多