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

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

问题描述:

我有这个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 

和日间功能的启动。编辑:我没有遇到我的日期转换(除非它不知道如何处理星期五)的麻烦。我需要返回no行部分的帮助。

示例数据:

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, -1, @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, 0, @date) - 1, 0) 
    And LastInvoiceDate < DateAdd(d, DateDiff(d, 0, @date), 0) 
Order By JobNumber Desc 

    --Returns 21 records 
+0

为什么不能使用CONVERT(varchar,getdate(),101) – THEn 2011-06-14 17:48:56

+0

@THEn - 没有理由。这是我继承的代码。 – MAW74656 2011-06-14 17:50:45

+1

陶氏你有样品数据至少有一行没有显示.... – THEn 2011-06-14 17:55:24

其更新jobclosed表的过程是从周一,周二,周三,周四,周五&早晨。它不会在星期六运行,所以直到星期一才会插入记录,此时它们将不会被我的存储过程检索到。我会安排更新工作在星期六运行。

我加入了select语句之前如下:

if datepart(dw, GETDATE()) = 7 OR datepart(dw, GETDATE()) = 1 
    BEGIN 
     Exec dbo.NCL_MaintainJobClosedDateTable 
     --Select 'True' 
    END 

这将迫使在周六和周日上午的最新情况。

而不是DATEADD(d, -1, GETDATE())你应该使用一个表达式返回前一天的开始。你可以使用你的dbo.ufn_StartOfDay()函数,该函数,但有更简单的方法做同样的:

Select @DayStart = DateAdd(d, DateDiff(d, 0, @inDate), 0) 

这意味着:由零时间戳和给定的一个之间的全部天数的增加零时间戳。

我也建议使用表达,而不是已经存在的调用函数一样,所以您的查询将是:

Select [JobNumber] 
From [NCLGS].[dbo].[JobClosedDate] 
Where LastInvoiceDate Between DateAdd(d, DateDiff(d, 0, GetDate()) - 1, 0) 
          And DateAdd(d, DateDiff(d, 0, 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, '2011-06-10 00:00:00.000', 'Friday' 
    Union All Select 112068, '2011-06-10 00:00:00.000', 'Friday' 
    Union All Select 112082, '2011-06-10 00:00:00.000', '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, DateDiff(d, 0, TD.Date) - 1, 0) 
          And DateAdd(d, DateDiff(d, 0, TD.Date),  0) 

Group By TD.Date 

更新

在看你的意见和代码,我认为这个问题是在你使用BetweenCol Between DateA And DateB转换为Col >= DateA And Col <= DateB。即包含两个端点。相反,您需要排除最后的终点:

Select [JobNumber] 
From [NCLGS].[dbo].[JobClosedDate] 
Where LastInvoiceDate >= DateAdd(d, DateDiff(d, 0, GetDate()) - 1, 0) 
    And LastInvoiceDate < DateAdd(d, DateDiff(d, 0, GetDate()), 0) 
Order By JobNumber Desc 

这会给你所有在前一天的工作号码。一世。e,如果今天是2011年6月10日星期五,它会给你所有从2011-06-09 midnight2011-06-09 23:59:59的LastInvoiceDate值。

+0

@Thomas @Andriy - 我明白你的意思,但是当我传递函数GETDATE()时,它会返回正确的日期时间:'2011-06-14 00:00:00.000' – MAW74656 2011-06-14 20:48:05

+0

@ MAW74656 - 没关系。您希望将SQL今天的日期作为实际的DateTime,以便您可以对其进行数学运算。如果您试图将今天的日期作为值返回,请按原样返回,并在报表或输出(例如Excel)中格式化。 – Thomas 2011-06-14 20:55:59

+0

@托马斯 - 我很抱歉,但我不明白。你是说根据数学要求我的代码看起来不错? – MAW74656 2011-06-15 13:56:28

Floor a date in 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 
+0

问题不在于剥离时间部分。这是一个没有问题的解决方案。 – MAW74656 2011-06-21 16:28:09

+0

@ MAW7465 - 你让我...你的问题没有问题 - 测试数据到底是什么,你不期待什么结果? – Hogan 2011-06-22 04:01:16