0

我正在尝试从 MariaDB 连接两个表并将长文本(我假设它与字符串相同?)转换为日期。

我搜索了几个论坛并阅读了一些 MariaDB 文档,但我不是一个精通 SQL 编码器,所以我可能在某个地方的语法有误,如果你能提供任何帮助,我将不胜感激。

'membership_expiry_date' 中的数据不是强制性的 - 一些条目为 NULL,但如果有日期,则它是以下格式的长文本:2019/12/31 (YYYY/mm/dd)

SELECT u1.`ID` AS 'User ID',
       u1.`user_login` AS 'Website ID',
       m1.meta_value AS 'Last Name',
       m2.meta_value AS 'First Name',
       m3.meta_value AS 'Subs Expire',

FROM dbName_users u1
       LEFT JOIN dbName_usermeta m1 ON (m1.`user_id` = u1.`ID` AND m1.`meta_key` = 'last_name')
       LEFT JOIN dbName_usermeta m2 ON (m2.`user_id` = u1.`ID` AND m2.`meta_key` = 'first_name')
       LEFT JOIN dbName_usermeta m3 ON (m3.`user_id` = u1.`ID` AND m3.`meta_key` = STR_TO_DATE('membership_expiry_date', '%Y/%m/%d'))

基本上我需要将日期作为日期拉出来,以便以后可以对其进行操作,如果它是字符串,我将无法做到这一点。

如果我设法让这个(或其他一些变体)代码运行,那么到目前为止的结果都是 NULL。

更新 所以我在 wpDataTable WordPress 插件中使用下面的代码,虽然我认为它正在使用“membership_expiry_date”并产生一个 DATE 列(“Subs_Expire”),但我无法像 DATE 列一样操作 wpDataTables 插件中的列. 我知道这一点是因为我添加了包含 DATETIME 数据的“User_Registered”列,并且在条件格式选项中确实具有大于和小于运算符,但“Subs_Expire”列没有。

我尝试使用具有各种 DATE/TIME 选项的 CAST() 和 CONVERT() 而不是 STR_TO_DATE(),但没有运气。

我在 TMS 网站上发布了一个查询,wpDataTables 的编码人员,看看他们是否可以提供帮助:https ://tmsplugins.ticksy.com/ticket/1989889/

SELECT u1.`ID` AS `User ID`,
       u1.`user_login` AS `Website_ID`,
       u1.`user_registered` AS `User_Registered`,
       m1.meta_value AS `Last_Name`,
       m2.meta_value AS `First_Name`,
       STR_TO_DATE(m3.meta_value, '%Y/%m/%d') as `Subs_Expire`,

FROM dbName_users u1 LEFT JOIN
     dbName_usermeta m1
     ON m1.`user_id` = u1.`ID` AND
        m1.`meta_key` = 'last_name' LEFT JOIN
     dbName_usermeta m2
     ON m2.`user_id` = u1.`ID` AND
        m2.`meta_key` = 'first_name' LEFT JOIN
     dbName_usermeta m3
     ON m3.`user_id` = u1.`ID` AND
         m3.`meta_key` = 'membership_expiry_date';
4

2 回答 2

0

你的最后一句话可能是这样的。

LEFT JOIN icxdx_usermeta m3 ON (m3. user_id= u1. IDAND m3. meta_key= (SELECT CAST(membership_expiry_date AS DATE))

我想这个声明必须有效。但它可能会为 null 创建错误。试试看。

于 2019-04-26T08:22:00.590 回答
0

ON您需要子句中键的匹配条件和中的转换SELECT

SELECT u1.`ID` AS `User ID`,
       u1.`user_login` AS `Website ID`,
       m1.meta_value AS `Last Name`,
       m2.meta_value AS `First Name`,
       STR_TO_DATE(m3.meta_value, '%Y/%m/%d')) as `Subs Expire`
FROM dbName_users u1 LEFT JOIN
     dbName_usermeta m1
     ON m1.`user_id` = u1.`ID` AND
        m1.`meta_key` = 'last_name' LEFT JOIN
     dbName_usermeta m2
     ON m2.`user_id` = u1.`ID` AND
        m2.`meta_key` = 'first_name' LEFT JOIN
     dbName_usermeta m3
     ON m3.`user_id` = u1.`ID` AND
        m3.`meta_key` = 'membership_expiry_date';

我认为使用带有空格的列别名是不好的做法。如果必须,则使用反引号(或双引号)作为分隔符。仅对字符串和日期常量值使用单引号。

于 2019-04-26T11:14:51.833 回答