我有一个带有两个字段的MVC项目,用户可以在其中输入两个日期。
型号:
new Foo()
这两个日期属于数据库[DisplayName("Date From")]
public string DateFrom { get; set; }
[DisplayName("Date To")]
public string DateTo { get; set; }
中的一列。该日期范围是结果。
在数据库中,列OriginalDate
是一个OriginalDate
字段。语法为character varying
。
当用户输入的是“日期自” DD.MM.YYYY
(14.02.2017
)和“日期至” DD.MM.YYYY
时,如何获得结果,我的查询会找到所有结果在这两个日期之间?
考虑以下陈述:
20.02.2019
这给了我一个结果,也是其他年份的结果。例如SELECT * FROM tbl.tbl
WHERE OriginalDate BETWEEN '14.02.2017' AND '20.02.2019'
或DD.MM.1998
。我该如何强制这种说法有效?
然后我尝试了DD.MM.2009
:
TO_DATE
我收到此错误:
SELECT * FROM tbl.tbl
WHERE OriginalDate BETWEEN TO_DATE('14.02.2017', 'DD.MM.YYYY')
AND TO_DATE('20.02.2019', 'DD.MM.YYYY')
此外,我的问题是,如果我将其转换为日期,那么当该列是字符变量时会找到它吗?
我该如何解决这个问题?
答案 0 :(得分:0)
您可以创建此功能:
CREATE FUNCTION str2date(text) RETURNS date
LANGUAGE sql IMMUTABLE AS
$$SELECT to_date($1, 'DD.MM.YYYY')$$;
没关系,因为它确实是不可变的。
然后您可以查询:
... WHERE str2date(originaldate) BETWEEN str2date('10.12.2018')
AND str2date('01.01.2019')
您甚至可以创建索引来加快速度:
CREATE INDEX ON tbl.tbl (str2date(originaldate));
当然,最好将数据存储为正确的数据类型。这样一来,您就可以避免这种扭曲。