Sql server 如果有一个字段是时间,则需要查找HH:MM AM/HH:MM PM格式以外的字段

Sql server 如果有一个字段是时间,则需要查找HH:MM AM/HH:MM PM格式以外的字段,sql-server,Sql Server,我正在寻找一个表,该表包含特定业务在SQL Server表中打开的小时的起始时间和结束时间,数据输入为char,而不是时间格式。它需要是12小时格式的MM:HH AM或PM。有许多输入的时间格式不正确。我如何创建一个Case语句或其他东西来捕获格式错误的语句 我什么都没试过,我不知道从哪里开始 没有代码显示 例如,我希望8am或23:59出现在case statement列中,并输入任何失败消息。我在问题下方的评论站在这一点上,但要重申:不要使用char存储日期和时间值。使用错误的数据类型可能(

我正在寻找一个表,该表包含特定业务在SQL Server表中打开的小时的起始时间和结束时间,数据输入为char,而不是时间格式。它需要是12小时格式的MM:HH AM或PM。有许多输入的时间格式不正确。我如何创建一个Case语句或其他东西来捕获格式错误的语句

我什么都没试过,我不知道从哪里开始

没有代码显示


例如,我希望8am或23:59出现在case statement列中,并输入任何失败消息。

我在问题下方的评论站在这一点上,但要重申:不要使用
char
存储日期和时间值。使用错误的数据类型可能(并且将)导致问题。您应该使用适当的数据类型(在本例中为
time
),并让您的表示层处理格式设置

但是,首先,为了明确回答您的问题,您声明需要格式
HH:MM AM/PM
,这意味着您可以使用类似
的表达式:

SELECT TimeColumn
FROM YourTable
WHERE TimeColumn NOT LIKE '[0-1][0-9]:[0-5][0-9] [AP]M';
但是,这仍然存在缺陷,因为它允许类似于
'19:00am'
的值。因此,您可以更具体地执行以下操作:

SELECT TimeColumn
FROM YourTable
WHERE TimeColumn NOT LIKE '0[0-9]:[0-5][0-9] [AP]M'
  AND TimeColumn NOT LIKE '1[0-2]:[0-5][0-9] [AP]M';
就个人而言,我实际上会将上述内容添加为
检查约束
,以停止插入错误数据,但您需要首先修复数据:

ALTER TABLE YourTable
    ADD CONSTRAINT ck_ValidTime
    CHECK (TimeColumn NOT LIKE '0[0-9]:[0-5][0-9] [AP]M' AND TimeColumn NOT LIKE '1[0-2]:[0-5][0-9] [AP]M');
但是,正如我所说的,您确实可以修复数据类型。我首先添加一个新列来存储旧数据:

ALTER TABLE YourTable ADD TimeStringColumn char(8);
GO
UPDATE YourTable SET TimeStringColumn = TimeColumn;
然后更正列的值,然后更改数据类型:

UPDATE YourTable SET TimeColumn = TRY_CONVERT(char(8),TRY_CONVERT(time,'12:17 AM'),114);

ALTER TABLE YourTable ALTER COLUMN TimeColumn time(0);

如果你想要一个很好的理由来解释为什么你需要改变你的数据类型,根据你的数据
'12:58 AM'
'is
'10:01 PM'

使用
时间
数据类型,并担心你演讲中的格式;这就是它(表示层)的作用。如果您想找出哪些值无效
time
值,请使用
TRY\u CONVERT
,如果值无效,它将返回
NULL
。请至少给出几个允许值和不允许值的真实示例,您可以使用CHARINDEX来检查字符串中的AM或PM,因此作为一个开始案例,当CHARINDEX('PM',DateField)=0和CHARINDEX('AM',DateField)=0时,然后“无AM/PM标记”或者DateField结束——当然,您也可以将这种登录放在WHERE中。因此,对于8am,您可以编写一个自定义布尔函数,或者使用正则表达式来检查它it@Larnu这种格式很有效,但8AM格式正在通过,我想这是一种可转换格式。你知道吗,如果没有标准的12小时格式,如何查找内容?我无法控制从中提取的源数据。该应用程序允许用户在时间字段中输入自由文本,不幸的是,这就是我们出现此问题的全部原因,它存储为CHAR。我会看看你的解决方案。谢谢您的帮助。@laurnu我尝试了这个查询,从表中得到了如下示例-7:00 AM select ID,HR1,其中HR1不喜欢“0[0-9]:[0-5][0-9][AP]M”,HR1不喜欢“1[0-2]:[0-5][0-9][AP]M”;你知道为什么这些没有被排除在外吗?你的帖子说格式是
hh:mm am/pm
@JavidCode2015。您给出的示例缺少前导的
0
,这不是格式
hh:mm
它是
h:mm
。好的,对不起,我在操作中出错了。可能是1-9的任何内容,我想我可以从where子句中删除0。