SQL查询错误不会返回星期五的值

问题描述

| 我有这个sql存储过程,应该查看特定的表并根据日期列返回作业号。除了在周六上午运行(这应该返回日期为星期五的所有作业编号,但不返回任何行)之外,此方法效果很好。有什么建议么?我没有在这里看到一些逻辑问题吗?我该如何追踪? 储存程序
ALTER Procedure [dbo].[JC_GetJobsClosedYesterday]

As

SELECT [JobNumber]
  FROM [NCLGS].[dbo].[JobClosedDate]
  Where LastInvoiceDate between dbo.ufn_StartOfDay (DATEADD(d,-1,GETDATE())) AND dbo.ufn_StartOfDay (GETDATE())
  order by JobNumber desc
和开始一天的功能
ALTER function [dbo].[ufn_StartOfDay] ( @inDate datetime )

RETURNS DateTime AS 
BEGIN   
DECLARE @Now datetime   
set @Now = @inDate
DECLARE @DayStart datetime
set @DayStart = @Now

set @DayStart = DATEADD (ms,-DATEPART(ms,@Now),@DayStart)
set @DayStart = DATEADD (s,-DATEPART(s,@DayStart)
set @DayStart = DATEADD (mi,-DATEPART(mi,@DayStart)
set @DayStart = DATEADD (hh,-DATEPART(hh,@DayStart)

return @DayStart 
END
编辑:我的日期转换没有麻烦(除非它不知道如何处理星期五)。我需要返回无行部分的帮助。 样本数据:
JobNumber   LastInvoiceDate             DayOfWeek
112117      2011-06-13 00:00:00.000     Monday
112089      2011-06-10 00:00:00.000     Friday
112090      2011-06-10 00:00:00.000     Friday
112068      2011-06-10 00:00:00.000     Friday
112082      2011-06-10 00:00:00.000     Friday
更新:现在我真的很困惑。这种“周五没有数据”的事情已经发生了(上周五再次发生),但是我仍然无法弄清楚。 GETDATE()是否可能没有返回我认为返回的内容?因为当我尝试基于@Thomas的建议进行以下修改时,这两种方法都可以获取数据,但是最后一次基于此代码生成的报告没有数据。
DECLARE @date datetime
--SET @date = \'2011-06-21 13:42:27.257\'
SET @date = \'2011-06-11 03:42:27.257\'

--Original Code
SELECT [JobNumber]
  FROM [NCLGS].[dbo].[JobClosedDate]
  Where LastInvoiceDate between dbo.ufn_StartOfDay (DATEADD(d,@date)) AND dbo.ufn_StartOfDay (@date)
  order by JobNumber desc

  --Returns 21 records

--Modified based on @Thomas suggestion
Select [JobNumber]
From [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate >= DateAdd( d,DateDiff( d,@date ) - 1,0 )
    And LastInvoiceDate < DateAdd( d,@date ),0 )
Order By JobNumber Desc

  --Returns 21 records
    

解决方法

        您应该使用返回前一天开始的表达式而不是“ 4”。您可以使用
dbo.ufn_StartOfDay()
函数,但是有更简单的方法可以做到这一点:
Select @DayStart = DateAdd( d,DateDiff( d,@inDate ),0 )
这意味着:将nil时间戳增加nil时间戳与给定时间戳之间的整天。 我还建议使用该表达式,而不是已经存在的对该函数的调用,因此您的查询将是:
Select [JobNumber]
From [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate Between DateAdd( d,GetDate() ) - 1,0 )
                          And DateAdd( d,GetDate() ),0 )
Order By JobNumber Desc
加成 您需要更清楚地知道问题出在哪里。这是我创建的一个示例查询,它测试从6月9日星期四到6月18日星期六的每个日期。您希望在哪个日期获得值,但没有,反之亦然:
With SampleData As
    (
    Select 112117 As JobNumber,\'2011-06-13 00:00:00.000\' As LastInvoiceDate,\'Monday\' As DayOfWeek
    Union All Select 112089,\'2011-06-10 00:00:00.000\',\'Friday\'
    Union All Select 112090,\'Friday\'
    Union All Select 112068,\'Friday\'
    Union All Select 112082,\'Friday\'
    ),TestDates As
    (
    Select Cast(\'20110609\' As datetime) As Date
    Union All
    Select DateAdd(d,1,Date)
    From TestDates
    Where Date <= \'20110617\'
    )
Select TD.Date,DateName(dw,TD.Date),Count(SD.JobNumber)
From TestDates As TD
    Left Join SampleData As SD
        On SD.LastInvoiceDate Between DateAdd( d,TD.Date ) - 1,TD.Date ),0 )

Group By TD.Date
更新资料 在查看您的注释和代码时,我认为问题在于您使用
Between
Col Between DateA And DateB
转换为
Col >= DateA And Col <= DateB
。即,它包括两个端点。相反,您需要排除最终终点:
Select [JobNumber]
From [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate >= DateAdd( d,0 )
    And LastInvoiceDate < DateAdd( d,0 )
Order By JobNumber Desc
这将为您提供上一个日期的所有职位编号。也就是说,如果今天是2011年6月10日,星期五,它将为您提供从
2011-06-09 midnight
2011-06-09 23:59:59
的所有LastInvoiceDate值。     ,        请参见在SQL Server中设置日期 要剥离时间部分,请使用:
 SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)
这应该是最快的方法。从而
SELECT [JobNumber]
  FROM [NCLGS].[dbo].[JobClosedDate]
  WHERE LastInvoiceDate between 
       CAST((FLOOR(CAST(GETDATE() float))-1.0) AS DATETIME) AND
        CAST(FLOOR(CAST(GETDATE() AS float)) AS DATETIME)
  ORDER BY JobNumber DESC
    ,        更新作业关闭表的过程在星期一,星期二,星期三,星期四和星期五的早晨运行。它不会在周六运行,因此直到星期一才插入记录,这时我的存储过程将不会检索到这些记录。我将安排更新作业在周六也运行。 我在select语句之前添加了以下内容:
if datepart(dw,GETDATE()) = 7 OR datepart(dw,GETDATE()) = 1
    BEGIN
        Exec dbo.NCL_MaintainJobClosedDateTable
        --Select \'True\'
    END
这将强制在周六和周日上午进行更新。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...