查找位于sql中特定日期范围之间的数据

时间:2014-03-10 11:03:59

标签: sql sql-server tsql

我想从我的数据库中找到位于任何用户输入日期范围之间的记录(比如介于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)

但是使用此查询我需要输入我的数据库中可用的完美日期范围,它不会在输入的任何日期之间给出数据。

提前致谢

1 个答案:

答案 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列上使用任何索引。