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
其更新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
更新
在看你的意见和代码,我认为这个问题是在你使用Between
。 Col 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 midnight
到2011-06-09 23:59:59
的LastInvoiceDate值。
@Thomas @Andriy - 我明白你的意思,但是当我传递函数GETDATE()时,它会返回正确的日期时间:'2011-06-14 00:00:00.000' – MAW74656 2011-06-14 20:48:05
@ MAW74656 - 没关系。您希望将SQL今天的日期作为实际的DateTime,以便您可以对其进行数学运算。如果您试图将今天的日期作为值返回,请按原样返回,并在报表或输出(例如Excel)中格式化。 – Thomas 2011-06-14 20:55:59
@托马斯 - 我很抱歉,但我不明白。你是说根据数学要求我的代码看起来不错? – MAW74656 2011-06-15 13:56:28
若要去除时间部分使用:
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
为什么不能使用CONVERT(varchar,getdate(),101) – THEn 2011-06-14 17:48:56
@THEn - 没有理由。这是我继承的代码。 – MAW74656 2011-06-14 17:50:45
陶氏你有样品数据至少有一行没有显示.... – THEn 2011-06-14 17:55:24