mysql中转换为日期的字符串的逗号分隔列表

mysql中转换为日期的字符串的逗号分隔列表,mysql,sql,database,mysql-workbench,Mysql,Sql,Database,Mysql Workbench,我有一个如下所示的查询,其中一个名为“ListOfDate”的参数以字符串的形式出现在前端。我在mysql中有一个datetime数据类型为“ENCOUNTERDATE”的参数 SELECT d.encounterdate, d.hospitalid, amiop1, amiop2, amiop3, amiop4, amiop5, amiop16 FROM factopami f

我有一个如下所示的查询,其中一个名为“ListOfDate”的参数以字符串的形式出现在前端。我在mysql中有一个datetime数据类型为“ENCOUNTERDATE”的参数

SELECT d.encounterdate, 
       d.hospitalid, 
       amiop1, 
       amiop2, 
       amiop3, 
       amiop4, 
       amiop5, 
       amiop16 
FROM   factopami f, 
       dimpatientencounter d 
WHERE  d.hospitalid = 987654 
       AND d.measurecategory = 'AMI' 
       AND ( encounterdate IN ( ** listofdate ** ) 
              OR encounterdate IS NULL ) 
       AND d.patientid = f.patientid 
       AND d.id = f.patientencounterid 
ORDER  BY encounterdate; 
之后,我尝试将ListOfDate转换为日期:

 SELECT   d.encounterdate, d.hospitalid, amiop1, amiop2, amiop3, amiop4,
         amiop5, amiop16
    FROM factopami f, dimpatientencounter d
   WHERE d.hospitalid = 987654
     AND d.measurecategory = 'AMI'
     AND (   encounterdate IN (str_to_date ('01-10-2012' '%m-%d-%Y'))
          OR encounterdate IS NULL
         )
     AND d.patientid = f.patientid
     AND d.ID = f.patientencounterid
ORDER BY encounterdate;
这对单个字符串有效…但我得到了字符串列表,它给了我错误

SELECT d.encounterdate, 
       d.hospitalid, 
       amiop1, 
       amiop2, 
       amiop3, 
       amiop4, 
       amiop5, 
       amiop16 
FROM   factopami f, 
       dimpatientencounter d 
WHERE  d.hospitalid = 987654 
       AND d.measurecategory = 'AMI' 
       AND ( encounterdate IN ( Str_to_date('01-10-2012', '01-10-2012', 
                                '%m-%d-%Y') ) 
              OR encounterdate IS NULL ) 
       AND d.patientid = f.patientid 
       AND d.id = f.patientencounterid 
ORDER  BY encounterdate; 
限制0,1000错误代码:1582。调用本机函数“STR_to_DATE”0.000秒时参数计数不正确


那么,我如何将其转换为mysql级别的

简言之——在您将列表转换为:

(encounterdate IN ( STR_TO_DATE('01-10-2012','01-10-2012', '%m-%d-%Y'))
相反,您需要将其转换为:

( encounterdate IN ( STR_TO_DATE('01-10-2012', '%m-%d-%Y')
                   , STR_TO_DATE('01-10-2012', '%m-%d-%Y') )
作为更多的解释,IN操作员需要一个列表:

encounterdate IN ( thing1, thing2, thing3 ) 
你要传递的是一个日期,这意味着你正在这样做:

encounterdate IN ( date1, date2, date3 )
唉,您使用的是字符串而不是日期,因此您需要将每个字符串转换为日期。因此,您需要进行一些转换

date1 needs to be STR_TO_DATE( string1, '%m-%d-%y )
date2 needs to be STR_TO_DATE( string2, '%m-%d-%y )
date3 needs to be STR_TO_DATE( string3, '%m-%d-%y )
综上所述,您需要生成:

encounterdate IN ( STR_TO_DATE('01-10-2012', '%m-%d-%Y')
                 , STR_TO_DATE('01-10-2012', '%m-%d-%Y')
                 , STR_TO_DATE('01-10-2012', '%m-%d-%Y')
作为一种替代方法,如果您觉得不可能产生此结果,您可以在进行比较时翻转转换,使用
日期格式
遇到日期
列转换为字符串

此处的文档:

这将导致:

DATE_FORMAT( encounterdate, '%m-%d-%Y' ) IN ( '01-10-2012'
                                            , '01-10-2012'
                                            , '01-10-2012' )

但是,您应该记住,这将对
遇到日期的索引产生影响,尽管这在您的用例中可能不是问题。

正如mysql手册中的str_to_date函数所述,只获取参数。第一个参数是日期字符串,第二个参数是日期字符串的格式。因此不能这样使用它:

STR_TO_DATE('01-10-2012','01-10-2012', '%m-%d-%Y')
您应该使用以下选项:

STR_TO_DATE('01-10-2012', '%m-%d-%Y'),STR_TO_DATE('01-10-2012', '%m-%d-%Y')

我想您可以将encounterdate转换为字符串——使用DATE_格式,尽管这会限制该列上索引的使用。在您的特定用例中,这可能不是问题。请看这里: