【发布时间】:2021-07-01 04:30:45
【问题描述】:
以下是将查询返回到我的暗网项目的过程。我想在哪里获取过去 6 个月、过去 1 周和过去 1 个月的记录。
我会根据查询结果返回'KAYITTARIHI'
ALTER PROCEDURE [dbo].[CVSearch]
@Adi nvarchar(50) = NULL,
@Soyadi nvarchar(50) = NULL,
@BasvuruTarihi nvarchar(50) = NULL
AS
IF (@Adi = '')
SET @Adi = NULL
IF (@Soyadi = '')
SET @Soyadi = NULL
IF (@BasvuruTarihi = '')
SET @BasvuruTarihi = NULL
SELECT ID_CV
FROM CV
WHERE KULLANICILAR_CV_SILMEDURUMU = 0
AND ADI LIKE '%' + ISNULL(@Adi, ADI) + '%'
AND SOYADI LIKE '%' + ISNULL(@Soyadi, SOYADI) + '%'
AND CASE
WHEN @BasvuruTarihi = 'Hepsi'
THEN KAYITTARIHI
WHEN @BasvuruTarihi = 'Last 1 week'
THEN DATEDIFF(day, KAYITTARIHI, GETDATE()) < 8
WHEN @BasvuruTarihi = 'Last 1 month'
THEN DATEDIFF(day, KAYITTARIHI, GETDATE()) < 31
WHEN @BasvuruTarihi = 'Last 6 month'
THEN DATEDIFF(day, KAYITTARIHI, GETDATE()) < 180
ELSE @BasvuruTarihi
END = KAYITTARIHI
但我收到这些错误:
当 @BasvuruTarihi='Last 1 week' 然后 DATEDIFF(day,KAYITTARIHI,GETDATE()) 时,'> 附近的语法不正确
当 @BasvuruTarihi='Last 1 month' THEN DATEDIFF(day,KAYITTARIHI,GETDATE()) 时,'day' 附近的语法不正确预期 '(' 或 SELECT =>>
'=' 附近有错误的语法期待对话 =>> end = KAYITTARIHI
【问题讨论】:
-
对换行符和空格的良好使用将使 SQL 更易于阅读和调试。
-
另外,你听到的是一个包罗万象的查询,但像
like '%' + ISNULL(@Adi, ADI) + '%'这样的语法将远非高效。 -
您已将日期时间比较作为
THEN的一部分case表达式 - 这是非法的。case表达式只能返回一个值。您还可能(取决于这些比较应该做什么,从不同的分支获得完全不同的返回值 - 这也是非法的。 -
then DATEDIFF(day,KAYITTARIHI,GETDATE())<8是什么意思?如果你想要一个真/假结果,你需要一个额外的 CASE 或 IIF 语句。 -
A
CASEexpression 返回一个 scalar 值。看看你的;您有 2 个子句返回一个标量值,然后其他 3 个子句返回一个布尔结果,然后将这些值 compare 与KAYITTARIHI进行比较,这没有任何意义。同样,某些格式会很快向您展示该问题。
标签: sql sql-server tsql case