我很抱歉,但这是一个两部分的问题。
我对SQL非常陌生,正在尝试为我工作的小办公室开发一个时钟应用程序。我现在正在使用SQL后端,有一个关于复合语句的问题。
我被困住的地方是,如果用户试图退出休息,但从未在轮班开始时打卡,SQL需要创建新行,而不是更新现有行。
这是我尝试过的:
IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = '08/10/2012') AND userName = 'test')
BEGIN
INSERT INTO Clock(clockDate, userName, breakOut)
VALUES({ fn NOW() }, 'test', { fn NOW() })
END
ELSE
BEGIN
UPDATE Clock
SET breakOut = { fn NOW() }
WHERE (clockDate = '08/10/2012') AND (userName = 'test')
END
我使用Visual Studio 2010连接到本地计算机上的SQL Server Express 2008来完成此操作。我得到一个错误,说“复合语句SQL结构或语句不受支持”。然而,紧随其后的是一条消息,指出1行已经受到影响,当我查看我的时钟表时,它看起来就像我期望的那样。最好的解决方法是什么?
这个问题的第二部分在我的WHERE语句中。有没有一个函数可以在clockDate列中获取今天的日期,而不必填充今天的日期?我只是想提前考虑如何构建前端应用程序。
IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = { fn CURRENT_DATE() }) AND userName = 'test')
这又一次给出了我想要的结果,但直到出现错误"Error in WHERE子句靠近'CURRENT_DATE'. Unable to parse query text“之后。
我希望我已经正确地解释了这一点,并感谢您的帮助!
编辑:
@RThomas @w00te
好的,那么使用clockDate作为日期字段,breakOut作为时间(0)字段,应该可以这样做吗?因为我仍然收到“不支持复合语句SQL结构或语句”的提示。语法错误,即使它似乎是工作的。
IF NOT EXISTS (SELECT * FROM Clock WHERE (clockDate = GETDATE()) AND (userName = 'test'))
BEGIN
INSERT INTO Clock(clockDate, userName, breakOut)
Values(GETDATE(), 'test', GETDATE())
END
ELSE
BEGIN
UPDATE Clock
SET breakOut = GETDATE()
WHERE (clockDate = GETDATE()) AND (userName = 'test')
END
我的表结果是:
clockDate userName clockIn breakOut breakIn clockOut
08/10/2012 test NULL 11:24:38 NULL NULL
这是我想要的结果,但是这个错误把我搞糊涂了。这是Visual Studio错误还是SQL错误?我将阅读Merge语句,感谢你们提供的链接。
发布于 2012-08-11 01:31:43
IF NOT EXISTS(SELECT * FROM Clock
WHERE clockDate = '08/10/2012') AND userName = 'test')
有一个额外的括号。我觉得如果你把它去掉也没问题:
IF NOT EXISTS(SELECT * FROM Clock WHERE
clockDate = '08/10/2012' AND userName = 'test')
此外,GETDATE()将把当前日期放在列中,但是如果您不想要这个时间,那么您就得玩一玩。我认为CONVERT(varchar(8),GETDATE(),112)只会给出日期(而不是时间)部分。
IF NOT EXISTS(SELECT * FROM Clock WHERE
clockDate = CONVERT(varchar(8), GETDATE(), 112)
AND userName = 'test')
也许应该这么做。
PS:使用merge语句:)
发布于 2012-08-11 01:35:55
您需要将其替换为WHERE clockDate = { fn CURRENT_DATE() } AND userName = 'test'
。请从{ fn CURRENT_DATE() })
中删除额外的")"
https://stackoverflow.com/questions/11906506
复制相似问题