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)。
备注:内容仅供参考。
