在varchar列中匹配日期

时间:2018-03-05 05:07:37

标签: sql sql-server regex

我有一个SQL Server表,存储时间如下(在varchar列中):

08 SEP 2015 09:15:16
08 SEP 2015 09:15:22
08 SEP 2015 09:15:22
08 SEP 2015 09:15:22
08 SEP 2015 09:15:26
08 SEP 2015 09:15:27
08 SEP 2015 09:15:31

我想写一个查询,它可以为我提供特定月份和年份的所有条目。喜欢&2016; 1月2016'等等。

我正在使用SQL Server。

2 个答案:

答案 0 :(得分:2)

如果您无法更改所拥有的日期类型,则需要使用format()函数投射来格式化日期( MMM yyyy < / em>)可从 2012 +

获得
SELECT 
       FORMAT(CAST(<column> AS DATE), 'MMM yyyy') as dates
FROM table t

您还可以使用datepart()功能过滤日期

WHERE 
DATEPART(MONTH, dates) = 1 and DATEPART(year, dates) = 2015

为了只想显示计数,请使用count()函数

SELECT COUNT(*)
FROM table
WHERE DATEPART(MONTH, dates) = 1 AND 
      DATEPART(year, dates) = 2015

答案 1 :(得分:1)

正如评论中已经提到的,我建议将此数据类型更改为日期/时间戳字段,以避免数据不一致和/或在尝试转换字符串时使部分应用程序崩溃(不是尊重日期对象的日期格式。

现在当且仅当它在短期内不可行时,您有两种方法可以继续:

<强> 1。数据转换:

第一个是从表中提取所有记录并在进行比较之前将它们转换为日期类型, 但是,如果至少有一个varchar不是格式正确date,则您的查询将失败。

<强> 2。使用字符串:

另一种方法是使用下文所述的varchar直接查询您的数据库,以避免出现这些转换问题:

select * from table_A where date_column like '%JAN 2016%'

但是使用like的查询有点慢并且只能用作临时解决方案,可以长期调整数据模型 你的生活,并有一个更稳定/强大的应用程序

最后但并非最不重要的是,尝试运行一些查询来检查数据库中是否插入了一些错误的数据(格式或不是日期的字符串)。您可能已经面临一些数据不一致问题。