如何检查sql server中是否存在多个日期格式?

如何检查sql server中是否存在多个日期格式?,sql,sql-server,Sql,Sql Server,我需要检查sql server中同一列中是否存在多个日期格式 列的数据类型为nvarchar drop table dateformats create table dateformats(datevalue varchar(50)) insert dateformats values ('01-january-2019'),('31-JAN-2019'),('2019-01-01'), ('16-07-2019'),('20-12-2019'),('16-10-2019'),('16-AU

我需要检查sql server中同一列中是否存在多个日期格式

列的数据类型为nvarchar

drop table dateformats

create table dateformats(datevalue varchar(50))

insert dateformats
values ('01-january-2019'),('31-JAN-2019'),('2019-01-01'),
('16-07-2019'),('20-12-2019'),('16-10-2019'),('16-AUG-2019'),('AUG-07-2019'),('16/07/2019'),('07/16/2019'),('01-jan-2019'),('01-january-2019'),(''),(NULL)

SELECT datevalue  
FROM dateformats
返回以显示列具有多个日期格式的查询。

您可以使用group by和having:


您可以尝试使用此查询

现在,我已经在查询中修复了DMY和MDY的4种格式,但如果您已经在数组或SQL表中使用了所有格式,则可以在查询中使用它

此查询将返回您在表的特定列中使用的所有日期格式

SET DATEFORMAT dmy 
SELECT formats into #temp FROM (

SELECT 
max( 
CASE WHEN isdate(datevalue) = 1 then
(CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'dd-MM-yyyy') AS VARCHAR(50)) THEN 'dd-MM-yyyy' ELSE '' END)
ELSE '' END )
AS formats from dateformats 

UNION 

SELECT 
max( 
CASE WHEN isdate(datevalue) = 1 then
(CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'dd/MM/yyyy') AS VARCHAR(50)) THEN 'dd/MM/yyyy' ELSE '' END)
ELSE '' END )
AS formats from dateformats 

UNION 

SELECT 
max( 
CASE WHEN isdate(datevalue) = 1 then
(CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'dd-MMM-yyyy') AS VARCHAR(50)) THEN 'dd-MMM-yyyy' ELSE '' END) 
ELSE '' END )
AS formats from dateformats

) AS a

WHERE formats <> '';

  set dateformat MDY  insert into #temp
    SELECT formats  FROM (

    SELECT 
    max( 
    CASE WHEN isdate(datevalue) = 1 then
    (CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'MM-dd-yyyy') AS VARCHAR(50)) THEN 'MM-dd-yyyy' ELSE '' END)
    ELSE '' END )
    AS formats from dateformats 

    UNION 

    SELECT 
    max( 
    CASE WHEN isdate(datevalue) = 1 then
    (CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'MM/dd/yyyy') AS VARCHAR(50)) THEN 'MM/dd/yyyy' ELSE '' END) 
    ELSE '' END )
    AS formats from dateformats

    ) AS b

    WHERE formats <> '';

select * from #temp

日期在SQL Server中没有格式;日期/时间数据类型存储为二进制值。你有一个varchar,不是nvarchar,但不是约会。SQL Server对试图表示日期的字符串的格式没有概念。如果首先定义一种可识别的格式,例如dd-MM-yyyy,则可能有机会解决此问题。通过一些努力,就可以查询符合它的行。然后定义多个可识别的格式,并选择符合每种格式的行数*。您需要不断添加格式,直到每一行恰好匹配一种可识别的格式。然后检查是否有多个返回计数>0的格式。
SET DATEFORMAT dmy 
SELECT formats into #temp FROM (

SELECT 
max( 
CASE WHEN isdate(datevalue) = 1 then
(CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'dd-MM-yyyy') AS VARCHAR(50)) THEN 'dd-MM-yyyy' ELSE '' END)
ELSE '' END )
AS formats from dateformats 

UNION 

SELECT 
max( 
CASE WHEN isdate(datevalue) = 1 then
(CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'dd/MM/yyyy') AS VARCHAR(50)) THEN 'dd/MM/yyyy' ELSE '' END)
ELSE '' END )
AS formats from dateformats 

UNION 

SELECT 
max( 
CASE WHEN isdate(datevalue) = 1 then
(CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'dd-MMM-yyyy') AS VARCHAR(50)) THEN 'dd-MMM-yyyy' ELSE '' END) 
ELSE '' END )
AS formats from dateformats

) AS a

WHERE formats <> '';

  set dateformat MDY  insert into #temp
    SELECT formats  FROM (

    SELECT 
    max( 
    CASE WHEN isdate(datevalue) = 1 then
    (CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'MM-dd-yyyy') AS VARCHAR(50)) THEN 'MM-dd-yyyy' ELSE '' END)
    ELSE '' END )
    AS formats from dateformats 

    UNION 

    SELECT 
    max( 
    CASE WHEN isdate(datevalue) = 1 then
    (CASE WHEN CAST(datevalue AS VARCHAR(50)) = CAST(FORMAT(CAST(datevalue AS DATE),'MM/dd/yyyy') AS VARCHAR(50)) THEN 'MM/dd/yyyy' ELSE '' END) 
    ELSE '' END )
    AS formats from dateformats

    ) AS b

    WHERE formats <> '';

select * from #temp