将字符串转换为 SQL 中的日期数据类型 PHP Laravel 中的服务器
Convert string to date datatype in SQL Server in PHP Laravel
我正在尝试通过特定日期范围内的 ID 获取产品,但我面临的问题是:
- 日期为字符串格式
- 由于某些奇怪的原因,日期存储在数据库中的时间戳不完整(例如:'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]);
...
我正在尝试通过特定日期范围内的 ID 获取产品,但我面临的问题是:
- 日期为字符串格式
- 由于某些奇怪的原因,日期存储在数据库中的时间戳不完整(例如:'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. 转换列
- 对
$from
和$to
变量中的日期使用明确的格式 (yyyymmdd
)。 - 在您的 SQL 语句中使用参数绑定来防止 SQL 注入。
TRANSACTIONS_HD.TRANS_DATE
中的值
示例(基于您的代码):
...
$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]);
...