我很抱歉,但这是一个由两部分组成的问题。
我对 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')
同样,这给了我想要的结果,但直到收到错误“'CURRENT_DATE'附近的 WHERE 子句出错。无法解析查询文本。”
我希望我已经正确解释了这一点,并感谢您的帮助!
编辑:
@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 错误?我会阅读合并声明,谢谢你们的链接。