SQL Server SQL查询接受MM-DD-YYYY格式而不是DD-MM-YYYY格式的日期参数

qnakjoqk  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(105)

下面是我的存储过程,它接受两个日期参数,一个表示开始日期,另一个表示结束日期,它从连接表中获取一堆不同的数据:

@FromDate varchar(50),
@ToDate varchar (50)

SELECT DISTINCT 
    dbo.DefectInspection.DefectInspection_Id, 
    CONVERT(varchar(50), CAST(dbo.DefectInspection.DefectInspection_CreatedDate AS date), 34) AS CreatedDate
FROM           
    (bunch of tables)
WHERE
    CAST(DefectInspection.DefectInspection_CreatedDate AS date) 
        BETWEEN CAST( @FromDate AS Date) AND CAST(@ToDate AS Date)

问题是,如果我将日期输入为MM-DD-YYYY而不是第一天,它将只返回日期。这是一个问题,因为从客户端发送的日期样式始终是DD-MM-YYYY
使用所需输入:无数据返回n

使用月份格式-返回数据

kgsdhlau

kgsdhlau1#

使用SQL(和其他语言)时,最好使用明确的格式,如yyyy-mm-dd
还可以考虑使用DATE类型,而不是VARCHAR

@FromDate DATE(50),
@ToDate DATE(50)
lbsnaicq

lbsnaicq2#

虽然使用错误的数据类型是可怕的,但有时我们都必须处理不容易改变的问题。
您可以使用:

DECLARE @fromDate AS varchar(50);
DECLARE @toDate AS varchar(50);
DECLARE @from AS date;
DECLARE @until AS date;

SET @fromDate = '09-01-2023';
SET @toDate = '10-01-2023';

SET @from = TRY_CONVERT(date, @fromDate, 105);
SET @until = TRY_CONVERT(date, @toDate, 105);

IF @from IS NULL OR @until IS NULL
    THROW 51000, 'Parameter is not a valid date ..', 0;
ELSE BEGIN
    SELECT DISTINCT 
        ...
    FROM           
        (bunch of tables)
    WHERE TRY_CONVERT(date, DefectInspection.DefectInspection_CreatedDate, 110) BETWEEN @from AND @until;
END;

如果解析失败,TRY_CONVERT返回NULL。第三个参数(样式)105表示格式"dd-mm-yyyy",就像您使用它一样,110表示"mm-dd-yyyy"。

相关问题