将字符串转换为 SQL 中的日期数据类型 PHP Laravel 中的服务器

Convert string to date datatype in SQL Server in PHP Laravel

我正在尝试通过特定日期范围内的 ID 获取产品,但我面临的问题是:

  1. 日期为字符串格式
  2. 由于某些奇怪的原因,日期存储在数据库中的时间戳不完整(例如:'12-04-2020 12:21'),我正试图摆脱它

使用 Laravel 的 Eloquent 下面的查询在没有最后一行 (AND...) 的情况下工作,这是我尝试执行日期转换。

我也许可以用 MySQL 解决这个问题,但目前的任务是使用 SQL 服务器 不确定这里出了什么问题 任何帮助都非常有用。

$id = 2;
$from = '01-03-2020';
$to = '01-05-2020';



            $products = DB::select("SELECT DISTINCT
                                products.PRODUCT_ID,
                                products.PRODUCT_NAME,
                                TRANSACTIONS_DTL.PRODUCT_ID,
                                TRANSACTIONS_DTL.TRANS_ID,
                                TRANSACTIONS_DTL.PRODUCT_VALUE,
                                TRANSACTIONS_HD.TRANS_ID,
                                TRANSACTIONS_HD.TRANS_DATE
                             FROM
                             products
                                INNER JOIN TRANSACTIONS_DTL ON products.PRODUCT_ID = TRANSACTIONS_DTL.PRODUCT_ID
                                INNER JOIN TRANSACTIONS_HD ON TRANSACTIONS_DTL.TRANS_ID = TRANSACTIONS_HD.TRANS_ID
                             WHERE
                                products.PRODUCT_ID = $id 
                            AND TRANSACTIONS_HD.TRANS_DATE > CONVERT(date,'$from') AND TRANSACTIONS_HD.TRANS_DATE < CONVERT(date,'$to')
        ");

好的,重新阅读本文后,您似乎需要改为这样做:

AND CAST(SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 7, 4)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 4, 2)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 1, 2) 
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 12, 5)
        + ':00' AS datetime2) > '$from'
AND CAST(SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 7, 4)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 4, 2)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 1, 2) 
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 12, 5)
        + ':00' AS datetime2) < '$to'

希望这样更简单。 (为 table 使用别名会降低其密度)

在 SQL 服务器中,请注意您的 $from 和 $to 应该只是格式为 'YYYYMMDD' 的字符串,例如'20201231'。无论使用哪种日期数据类型,也无论语言和区域设置如何,这都会起作用。您只需将它们指定为字符串,无需强制转换它们。

注意:我还假定您的 table 中的日期格式是 DD-MM-YYYY,因为我无法从您的示例中判断它们是哪种方式。如果您的本地日期格式是 MM-DD-YYYY(即美国日期),请改用此代码:

AND CAST(SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 7, 4)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 1, 2)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 4, 2) 
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 12, 5)
        + ':00' AS datetime2) > '$from'
AND CAST(SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 7, 4)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 1, 2)
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 4, 2) 
        + SUBSTRING(TRANSACTIONS_HD.TRANS_DATE), 12, 5)
        + ':00' AS datetime2) < '$to'

您似乎将 datetime 值作为文本存储在 table 中(如果可能,请尝试解决该问题)。因此,要找到解决问题的方法,您可以尝试以下方法:

  • 使用适当的 style.
  • 转换列 TRANSACTIONS_HD.TRANS_DATE 中的值
  • $from$to 变量中的日期使用明确的格式 (yyyymmdd)。
  • 在您的 SQL 语句中使用参数绑定来防止 SQL 注入。

示例(基于您的代码):

...

$id = 2;
$from = '20200301';
$to = '20200501';

$products = DB::select("
    SELECT DISTINCT
        products.PRODUCT_ID,
        products.PRODUCT_NAME,
        TRANSACTIONS_DTL.PRODUCT_ID,
        TRANSACTIONS_DTL.TRANS_ID,
        TRANSACTIONS_DTL.PRODUCT_VALUE,
        TRANSACTIONS_HD.TRANS_ID,
        TRANSACTIONS_HD.TRANS_DATE
    FROM products
    INNER JOIN TRANSACTIONS_DTL ON products.PRODUCT_ID = TRANSACTIONS_DTL.PRODUCT_ID
    INNER JOIN TRANSACTIONS_HD ON TRANSACTIONS_DTL.TRANS_ID = TRANSACTIONS_HD.TRANS_ID
    WHERE 
        (products.PRODUCT_ID = ?) AND 
        (CONVERT(date, TRANSACTIONS_HD.TRANS_DATE, 105) > CONVERT(date, ?)) AND 
        (CONVERT(date, TRANSACTIONS_HD.TRANS_DATE, 105) < CONVERT(date, ?))
", [$id, $from, $to]);

...