【发布时间】:2012-01-26 08:53:43
【问题描述】:
我有一个日期与其他文本一起存储在文本字段中。他们为什么不把它放在日期字段中?我不知道,但我现在没有能力改变它。在代码的其他地方,我这样做是为了获取该日期在一定范围内的记录。它工作正常。
For Each i As InventoryItem In inventoryList
index = i.Notes.IndexOf("on {") + 4
scanned_dt = i.Notes.Substring(index, i.Notes.Length - index - 1)
If Date.Parse(scanned_dt) >= startDate And Date.Parse(scanned_dt) <= endDate Then
...
我现在正在尝试获取某个日期范围内的项目总数。
此 sql 语句用于获取所有日期的总数。如何更新 Where 子句以仅计算 i.Notes 包含 startDate 和 endDate 之间日期的项目
Dim sql As String = "Select COUNT(inv_PartNum) from lester.inventory i join lester.vendor v on v.vendor_ID = i.vendor_ID Where v.vendor_Name = '" + vendorName + "' AND i.inv_Desc LIKE '%" + size + "%'"
*已编辑* 我想出了这个 sql select 语句:
SELECT COUNT(i.inv_PartNum) FROM cdms.lester.inventory AS I
join CDMS.lester.vendor AS v on v.vendor_ID = i.vendor_ID Where v.vendor_Name = 'JVE-285'
AND CONVERT(DATETIME,
SUBSTRING(i.inv_Notes, CharIndex('on {', i.inv_Notes)+4, len(i.inv_Notes)-(CharIndex('on {', i.inv_Notes) + 4)
),101) BETWEEN '01-01-2011' AND '04-04-2011'
但我收到此错误: 将 char 数据类型转换为 datetime 数据类型导致 datetime 值超出范围。
为了弄清楚我创建了以下 sql select 语句:
SELECT * FROM (
SELECT i.inv_Notes,
CONVERT(DATETIME,SUBSTRING(i.inv_Notes, CharIndex('on {',i.inv_Notes)+4,LEN(i.inv_Notes)-(CharIndex('on {', i.inv_Notes) + 4)),101) AS d
FROM cdms.lester.inventory AS i
join CDMS.lester.vendor AS v ON v.vendor_ID = i.vendor_ID WHERE v.vendor_Name = 'JVE-285') AS s
我的 inv_Notes 列包含类似“Assigned to Tool Trailer {JVE-285} on {4/8/2011}”的字符串
当我运行如上所示的查询时,我会得到我的 inv_Notes 列和日期列。日期均以“2011-04-08 00:00:00.000”这种格式显示,并且没有抛出任何错误。
但是,一旦我添加了 WHERE 子句,我就会收到错误消息:将 char 数据类型转换为 datetime 数据类型导致 datetime 值超出范围。
我尝试过以各种方式格式化日期,但总是出错...
WHERE s.d > CONVERT(DATETIME, '2011-1-1', 101)
WHERE s.d < GetDate()
WHERE s.d > '20110101'
WHERE s.d >= '2011-01-01'
WHERE s.d >= '01-01-2011'
WHERE s.d > '01/01/2011'
编辑
我也试过
WHERE s.d IS NOT NULL
并得到同样的错误。这显然不是我认为它在 WHERE 处的 b/c 工作方式,转换应该已经成功发生。
解决方案 搞定了
SELECT * FROM (
SELECT i.inv_Notes,
SUBSTRING(i.inv_Notes, CharIndex('} on {',i.inv_Notes)+6,LEN(i.inv_Notes)-(CharIndex('} on {', i.inv_Notes) + 6))
AS d
FROM cdms.lester.inventory AS i
join CDMS.lester.vendor AS v ON v.vendor_ID = i.vendor_ID WHERE v.vendor_Name = 'JVE-285') AS s
WHERE PARSENAME(REPLACE(s.d, '/', '.'), 1)+
RIGHT('00'+PARSENAME(REPLACE(s.d, '/', '.'), 3),2)+
RIGHT('00'+PARSENAME(REPLACE(s.d, '/', '.'),2),2) BETWEEN '20110407' AND '20110409'
我尝试将其转换为 int 并进行整数比较,但随后出现错误。发现问题在于某些 inv_Notes 字段包含诸如“Item added {3/11/2011}”之类的数据,这些都不符合内部选择的条件,所以在我看来,如果它没有在内部选择中被选中,对于外部选择的条件,这应该不是问题。但是,它试图将 2011{311 转换为 int 并引发错误。我确定它试图将其转换为迄今为止,这就是我遇到以前问题的原因。
【问题讨论】:
-
您使用的是什么数据库?我会推荐写一个存储过程
标签: sql sql-server sql-server-2008 select substring