SQL之间的日期范围在字符串日期



我有一个数据库,它有date_col在varchar形式。我对数据库只有只读权限,不能修改数据库的结构。我想找出2020年6月和12月之间的所有表项。

我已经尝试了下面的查询,但它不工作。

SELECT *,CONVERT(VARCHAR, DATE_col, 101) as DATE_col_date
FROM DW.table_name 
where DATE_col_date between '2020-01-06' and '2020-31-12'
Name   ID   DATE_col       Place
A       1     01/12/2020    P1
B       2     01/06/2020    P1   
C       3     01/01/2020    P1
D       4     01/04/2020    P1
E       5     01/11/2020    P1
F       6     01/08/2020    P1

预期输出

Name   ID   DATE_col_date  Place
A       1     01/12/2020    P1
B       2     01/06/2020    P1   
E       5     01/11/2020    P1
F       6     01/08/2020    P1

误差

列名'DATE_col_date '无效。

最好的长期解决方案是使您的DATE_col成为真正的日期/时间戳类型列。话虽如此,如果你必须应付你目前的设计,那么考虑下面的答案。

在比较文本日期列和日期字面值时,应该在WHERE子句中调用CONVERT。此外,使用YYYYMMDD日期文字格式可以明确表示您的意思:

SELECT *
FROM DW.table_name 
WHERE CONVERT(DATE, DATE_col, 101) >= '20200106' AND
CONVERT(DATE, DATE_col, 101) <  '20210101';

注意,如果你使用的是最新版本的SQL Server,你也可以在这里使用TRY_CONVERT:

TRY_CONVERT(DATE, DATE_col)

此外,我在WHERE子句中表达了逻辑,以包括从2020年1月6日开始的所有日期,直到2020年底。这似乎就是你想要的。

SELECT *, CONVERT(DATE, DATE_col, 101) as DATE_col_date
FROM TABLE_NAME
WHERE CAST(DATE_col AS DATE) between CAST('2020-01-06' AS DATE) and CAST('2020-12-31'AS DATE)

试试这个就行了。

最新更新