字符串形式的德语日期之间进行搜索

时间:2019-02-21 14:46:05

标签: c# postgresql sqldatetime

我有一个带有两个字段的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.YYYY14.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')

此外,我的问题是,如果我将其转换为日期,那么当该列是字符变量时会找到它吗?

我该如何解决这个问题?

1 个答案:

答案 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));

当然,最好将数据存储为正确的数据类型。这样一来,您就可以避免这种扭曲。