抱歉,但这个问题有两部分。
我对 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 语句中。是否有一个函数来获取今天的日期,而不是填充今天的日期?只是试着提前考虑构建前端应用程序。
IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = { fn CURRENT_DATE() }) AND userName = 'test')
同样,这会给我我想要的结果,但不是直到得到一个错误“ Error in WHERE 子句靠近‘ CURRENT _ DATE’。无法解析查询文本。”
我希望我已经正确地解释了这一点,并感谢您的帮助! !
编辑:
@ RThomas @ w00te
好的,那么使用 lockDate 作为日期字段,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
这是我想要的结果,但是这个错误使我困惑。这是 VisualStudio 错误还是 SQL 错误?我会仔细阅读合并声明,谢谢你们的链接。