我试图让我的查询每年都自动更新,以便确定某个"债务"费用会每年增加,但无论我采用何种方法,它都无法正常工作。我的目标是每年自动增加75000。 以下是我试过的一些不起作用的东西。
CASE
WHEN DATENAME(dy, GETDATE()) = 1 THEN Debt + 75000
ELSE Debt
END AS [Debtt]
我试图使用"债务=债务+ 75000"就像我在Java中所知道的那样,但我在" ="中得到了错误的语法。标志。 所需的值仅适用于dayOfYear = 1,但会在dayOfYear = 2时返回初始值
我也试过这个
UPDATE Table
SET Debt = Debt + 75000
WHERE DATENAME(dy, GETDATE()) = 1
当我在那天执行查询时,这个只能工作。如果我继续执行它,该值将继续增加75000
最后但并非最不重要的是,我尝试使用变量添加IF语句。
@MoneyDebt AS MONEY = 0
IF DATENAME(dy, GETDATE()) = 1
BEGIN
UPDATE initialTable
SET @MoneyDebt = @MoneyDebt + 75000
END
-- useless statements
SELECT @MoneyDebt AS [Debt]
这样,当dayOfYear不同于1时,它实际上使MoneyDebt = 0,当它为1时,由于某种原因它实际上使MoneyDebt = 150000(这是所需值的两倍)
在过去的3天里,我一直在努力破坏我的大脑,尝试各种可能性并在网上查看所有内容。是否根本无法对SQL进行自动更新?应该注意我使用的是SQL Server 2014
答案 0 :(得分:3)
你想做的事情有点尴尬。你可以在每年的第一天投入一份工作来自动进行更新。
但是,我的建议更简单。只需保留数据的第一年,然后通过添加基于已经过的年数的值来进行增量。您可以在视图中执行此操作。或者,您可以使用计算列来执行此操作:
alter table t
add debtt as ( debt + 75000 + datediff(year, orig_date, getdate()) );
列debtt
将具有更新的值。
答案 1 :(得分:0)
在底部编辑。跳转到下面的MSFT部分。
(这个最重要的部分只是因为这个问题最初在其中有mysql
标签,我向你们MSFT伙伴道歉。)
考虑使用mysql的创建事件策略,这可能会导致无需执行cron作业。
DELIMITER $$
CREATE EVENT annualThingEvent
ON SCHEDULE EVERY '1' YEAR
STARTS '2016-01-01 00:00:00'
DO
BEGIN
-- perform some annual thing, as complicated as you want
END$$
DELIMITER ;
在CREATE EVENT上的手册页,
interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
正确设置事件甚至发生并监控它们非常重要。
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
ooops,事件调度程序未打开。
我可以整天等待,事件甚至没有打开
SET GLOBAL event_scheduler = ON; -- turn her on
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
按架构名称列出所有事件:
show events from so_gibberish;
或
show events\G; -- <--------- I like this one from mysql> prompt
show events; -- <--------- from workbench / sqlyog
*************************** 1. row ***************************
Db: so_gibberish
Name: set_trips_finished
Definer: GuySmiley@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2015-08-23 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
并不是我对它有任何了解,但我包含了这个,因为在删除整个答案时,OP问道。所以记住这一点。取自here。
<强>概述强>
调度是每个数据库管理软件的一个非常有用的功能。在MS SQL Server中,SQL Server代理充当调度程序,并执行任务。
<强>解释强>
SQL Server代理相当于MySQL事件调度程序。它是除MS SQL Express之外的每个版本的一部分。它可以从SQL Server Management Studio访问。
但是,MS SQL实现与MySQL中的CREATE EVENT语句语法非常不同。您必须分别创建工作,工作步骤和计划。有两种方法可以执行此任务,您可以使用GUI或创建Transact-SQL语句。
使用T-SQL创建预定作业的一般步骤如下:
sp_add_job
创建工作。sp_add_jobstep
以创建每个作业步骤。sp_add_schedule
以创建计划。您可以定义更多
时间表,例如在凌晨3点和晚上11点运行。sp_attach_schedule
将日程安排与作业相关联。sp_add_jobserver
以设置作业的服务器。另外,请查看有关实施工作的MSDN article。