我想从我的数据库中找到位于任何用户输入日期范围之间的记录(比如介于10/2/2008到26/9/2024之间)。我尝试使用
SELECT NAME
,TYPE
,COMP_NAME
,BATCH_NO
,SHELF
,MFG_DATE
,EXP_DATE
,QTY
,VAT
,MRP
FROM STOCK_LOCAL
WHERE
convert(VARCHAR(20), EXP_DATE, 103)
BETWEEN convert(VARCHAR(20), @MEDICINEEXP_DATE, 103)
AND convert(VARCHAR(20), @MEDICINEEXPDATE, 103)
但是使用此查询我需要输入我的数据库中可用的完美日期范围,它不会在输入的任何日期之间给出数据。
提前致谢
答案 0 :(得分:0)
由于它是一个池设计的架构,因此不会有任何体面/高效的解决方案。
在sql server中如果要存储日期或日期&时间数据。对列使用Data或DATETIME数据类型。
在您的情况下,您尝试将字符串与传递日期进行比较。甚至当你试图将字符串(日期)转换为日期数据类型时,你没有正确地做到这一点。
我的建议是使用Date数据类型向表中添加新列,并使用现有的日期/字符串值更新这些列。
现在,您可以使用以下代码将Date(字符串)转换为date数据类型。
DECLARE @MEDICINEEXP_DATE DATE = 'SomeValue1'
DECLARE @MEDICINEEXPDATE DATE = 'SomeValue1'
SELECT query....
FROM TableName
WHERE
CAST(
RIGHT(EXP_DATE, 4)
+SUBSTRING(EXP_DATE,CHARINDEX('/',EXP_DATE)+1,2)
+LEFT(EXP_DATE,2)
AS DATE) >= @MEDICINEEXP_DATE
AND CAST(
RIGHT(EXP_DATE, 4)
+SUBSTRING(EXP_DATE,CHARINDEX('/',EXP_DATE)+1,2)
+LEFT(EXP_DATE,2)
AS DATE) <= @MEDICINEEXPDATE
注意
此解决方案将为您提供预期的结果,但效率非常低。即使您在该列上有一个非常缓慢的索引,它也不会在EXP_DATE列上使用任何索引。