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

时间:2013-12-06 10:51:54

标签: mysql sql database mysql-workbench

我有一个查询,如下所示,其中一个名为“ListOfDate”的参数以字符串形式出现在前端...在mysql中的日期时间数据类型为“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; 

LIMIT 0,1000错误代码:1582。调用本机函数'STR_TO_DATE'0.000秒

时参数计数不正确

所以如何将它转换为mysql级别

2 个答案:

答案 0 :(得分:1)

简而言之 - 目前您将列表转换为:

(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')

作为替代方案,如果您认为无法生成此内容,则可以翻转转换,然后使用encounterdateDATE_FORMAT列转换为字符串你做比较。

此处的文档:

这将导致:

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

但是,您应该记住,这会对encounterdate的索引产生影响,尽管这可能不是您的用例中的问题。

答案 1 :(得分:0)

正如在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')