0

我正在使用 SQL 创建一个报告,以从我们的劳动力数据库中提取上个月记录的工时。我让它工作得很好,但需要添加逻辑以防止它在一月份运行时中断。我尝试添加 If/Then 语句和 CASE 逻辑,但我不知道是我做得不对,还是我们的系统无法处理它。这是提取日期范围的代码段:

SELECT
  ...
FROM
  ...
WHERE
  ...
   AND
YEAR(ENTERDATE) = YEAR(current date) AND MONTH(ENTERDATE) = (MONTH(current date)-1)
4

6 回答 6

1

只需使用 AND 作为这样的障碍。一月份,将执行第二个子句而不是第一个子句:

SELECT
  ...
FROM
  ...
WHERE
  ...
  AND
  (
    (
      (MONTH(current date) > 1) AND
      (YEAR(ENTERDATE) = YEAR(current date) AND MONTH(ENTERDATE) = (MONTH(current date)-1))
      -- this one gets used from Feb-Dec
    )
    OR
    (
      (MONTH(current date) = 1) AND
      (YEAR(ENTERDATE) = YEAR(current date) - 1 AND MONTH(ENTERDATE) = 12)
      -- alternatively, in Jan only this one gets used
    )
  )
于 2013-11-05T19:38:35.943 回答
1

如果您的报告始终是上个月的,那么我认为最简单的想法是声明上个月的年份和月份,然后在 Where 子句中引用它们。例如:

Declare LastMo_Month Integer = MONTH(DATEADD(MONTH,-1,getdate()));
Declare LastMo_Year Integer = YEAR(DATEADD(MONTH,-1,getdate()));

Select ...

Where MONTH(EnterDate) = @LastMo_Month
    and YEAR(EnterDate) = @LastMo_Year

您甚至可以更进一步,允许在任意月前创建报告:

Declare Delay Integer = -1;
Declare LastMo_Month Integer = MONTH(DATEADD(MONTH,@Delay,getdate()));
Declare LastMo_Year Integer = YEAR(DATEADD(MONTH,@Delay,getdate()));

Select ...

Where MONTH(EnterDate) = @LastMo_Month
    and YEAR(EnterDate) = @LastMo_Year

希望这可以帮助。

PS - 这是我在 StackOverflow 上的第一个答案,如果格式不正确,请见谅!

于 2013-11-05T19:48:21.003 回答
0

尝试将前一个月和前一年添加到您的 SELECT 语句中:

SELECT
    ...
    ,CASE MONTH(current date)
        WHEN 1 THEN 12
        ELSE MONTH(current date)-1
    END AS previous_month
    ,CASE MONTH(current date)
        WHEN 1 THEN YEAR(current date)-1
        ELSE YEAR(current date)
    END AS previous_year
FROM
    ...
WHERE
    ...
    AND YEAR(ENTERDATE) = previous_year
    AND MONTH(ENTERDATE) = previous_month

这应该允许您在比较之前设置值WHERE。这应该是执行此过程的最高效方式,因为它避免创建两个完全独立的子句或使用OR.

于 2013-11-05T19:36:26.570 回答
0
if(month(getdate()) = 1)
begin
        your jan logic
end
else
begin
        your logic
end

上面对案例的回答是可以的,但是在一个巨大的结果集上运行一个案例会非常昂贵

于 2013-11-05T19:38:17.877 回答
0

你说的是哪种 SQL 方言?

与使用 case 语句完成所有操作相反,只需使用内置的日期/时间函数从当前日期中减去一个月,这应该可以处理跨年边界。

办理

  WHERE
   YEAR(ENTERDATE) = year(dateadd(MONTH,-1, CURRENT_TIMESTAMP))
   AND MONTH(ENTERDATE) = month(dateadd(MONTH,-1, CURRENT_TIMESTAMP))

mysql

 WHERE
   YEAR(ENTERDATE) = YEAR(date_sub(curdate(),INTERVAL 1 MONTH))
   AND MONTH(ENTERDATE) = MONTH(date_sub(curdate(),INTERVAL 1 MONTH) )
于 2013-11-05T19:44:26.970 回答
0
WHERE
...
AND
DATEPART(yy,ENTERDATE) = DATEPART(yy,DATEADD(m,-1,ENTERDATE))
AND DATEPART(m,ENTERDATE) = DATEPART(m,DATEADD(m,-1,ENTERDATE))
于 2013-11-05T19:44:52.077 回答