PAYATHON 2026

ASP 中将日期从 mm-dd-yyyy 改为 dd-mm-yyyy

支付小周

结论

SQL Server 的 date、datetime 字段不保存 yyyy-mm-dd、mm-dd-yyyy 这类显示格式。日期在页面上的显示方式由 SQL 转换方式、ASP 代码和服务器区域设置决定。

如果日期只用于页面展示,可以在 ASP 中格式化。也可以在查询中使用 CONVERT,样式代码 105 会输出 dd-mm-yyyy。

方案一:在 SQL 查询中转换

把 [Posting Date] 转换为字符串,并设置别名:

SELECT
    CR.Name AS country,
    C.Name,
    C.[Name 2],
    C.[E-Mail],
    [Pre-Assigned No_],
    CONVERT(char(10), SIH.[Posting Date], 105) AS [Posting Date],
    SIH.[Currency Code],
    SIH.[Shipment Method Code],
    [Total Boxes],
    [ARE Net Wt],
    [ARE Gr_Wt],
    SIH.[Shipping Agent Code],
    SIH.[Payment Terms Code]
FROM [Sales Invoice Header] AS SIH
INNER JOIN [Country_Region] AS CR
    ON CR.Code = SIH.[Country of Final Destination]
INNER JOIN [Customer] AS C
    ON C.No_ = SIH.[Sell-to Customer No_]
WHERE SIH.No_ = 'PEXP1213-540';

CONVERT(char(10), date_value, 105) 的输出如下:

31-08-2026

如果 [Posting Date] 是 NULL,转换结果仍然是 NULL,因此 ASP 输出前需要判断空值。

方案二:在 Classic ASP 中格式化

如果日期还要用于排序、筛选或计算,最好让 SQL 返回原始日期值,只在页面输出时格式化:

<%
Function TwoDigits(value)
    TwoDigits = Right("0" & CStr(value), 2)
End Function

Function FormatDateDDMMYYYY(value)
    If IsNull(value) Or Not IsDate(value) Then
        FormatDateDDMMYYYY = ""
    Else
        FormatDateDDMMYYYY = _
            TwoDigits(Day(value)) & "-" & _
            TwoDigits(Month(value)) & "-" & _
            Year(value)
    End If
End Function

Response.Write Server.HTMLEncode( _
    FormatDateDDMMYYYY(rs("Posting Date")) _
)
%>

不要直接依赖以下写法:

FormatDateTime(rs("Posting Date"), vbShortDate)

vbShortDate 会采用服务器的区域设置,仍有可能输出 mm-dd-yyyy,不能保证格式固定为 dd-mm-yyyy。

注意事项

  • 不要为了调整显示格式而修改数据库字段类型。日期应继续使用 date、datetime 或其他日期类型保存,不要改成字符串。
  • 在 SQL 中转换为 char(10) 后,返回值不再是日期类型。它可以直接用于展示,但不适合继续进行日期计算。
  • 日期应按原始字段排序:
ORDER BY SIH.[Posting Date]

不要按格式化后的 dd-mm-yyyy 字符串排序,否则结果可能不符合实际的时间顺序。

  • 显示日期格式不需要使用动态 SQL。如果查询条件来自用户输入,应使用参数化查询,避免将输入值直接拼接到 SQL 字符串中。
  • 页面只需要展示日期时,优先在 ASP 中格式化。如果查询结果需要直接导出,或交给其他展示层使用,可以采用 SQL Server 的 CONVERT(..., 105)。

备注:内容仅供参考。