sql-server - 如何获取 Windows 批处理文件中的日期格式为 'yyyymmdd' ?

标签 sql-server windows date batch-file bcp

我正在写一个 Windows批处理文件和 batch file应该输出特定文件夹中的文件。我希望文件名写成如下:

filename-yyyymmdd.csv

其中 yyyymmdd 代表当前日期。

我的 batch file代码如下:
cd:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn
bcp "SELECT TOP 100 * FROM xxxx.dbo.xxxxx" queryout c:\test\csv\confirmed.csv -t, -c -S xxxx\xxxxx -U xxx -P xxxxxxxxxx
set mydate=%date:~10,4%%date:~4,2%%date:~7,2%
echo %mydate%
copy c:\test\csv\confirmed.csv c:\test\csvwithdates\confirmed-%mydate%.csv

我得到以下文件名作为输出:confirmed-ay18.csv
所需输出:confirmed-20180528.csv
我在 StackOverflow 上查看了以下问题但我很难实现建议的答案:

Get Date in YYYYMMDD format in windows batch file

Windows batch: formatted date into variable

我究竟做错了什么?

最佳答案

动态环境变量DATE以区域相关格式提供当前本地日期,即根据所用帐户的 Windows 区域和语言选项中设置的国家/地区。维基百科文章 Date format by country列出了世界各国使用的各种日期格式。

所以有必要使用在命令提示符窗口中运行批处理文件时使用的帐户运行 echo %DATE%并查看输出日期字符串。

输出日期是以缩写的工作日开头还是没有工作日的日期输出?第一个输出日期和下个月是数字还是第一个输出月份和第二天?月份输出是数字还是名称?是月中的某天还是值小于 10 的月份输出前导 0,因此总是两位数还是一位数?

一个非常常用的命令行,用于修改格式为 ddd, dd.MM.yyyy 的区域相关日期字符串与 ./或任何其他分隔符到 yyyyMMdd是:

set "LocalDate=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"

日期字符串从右侧替换,以使字符串替换独立于日期字符串开头是否存在工作日。

对于区域相关日期字符串 ddd, MM/dd/yyyy要使用的命令行是:
set "LocalDate=%DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%"

通过在命令提示符窗口中使用命令 运行命令,可以很容易地找出哪些字符串替换是必要的。回声 而不是 套装 :
echo %DATE%
echo %DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%
echo %DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%

另见 What does %date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2% mean?

使用动态环境变量的好处DATE是速度,因为此字符串替换由 Windows 命令处理器完成非常快。缺点是由于地区/国家依赖性而导致日期格式不同。

区域无关的解决方案是使用命令 WMIC 如下所示:
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocalDate=%%I"
set "LocalDate=%LocalDate:~0,8%"

WMIC 始终以 格式输出日期字符串yyyyMMddHHmmss.microsecond±UTC 偏移量(以分钟为单位)独立于配置了哪个国家以及为该国家设置了哪种日期格式。

使用的缺点WMIC 是执行所需的时间,因为它需要超过一秒才能输出由命令 处理的下一个 UTF-16 Little Endian 编码的日期字符串。对于 .

Why does %date% produce a different result in batch file executed as scheduled task? 上查看答案有关 Windows 命令处理器执行这两个命令行如何工作的非常详细的说明 cmd.exe .

完整的批处理文件:
@echo off
cd /D "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn"
bcp.exe "SELECT TOP 100 * FROM xxxx.dbo.xxxxx" queryout C:\test\csv\confirmed.csv -t, -c -S xxxx\xxxxx -U xxx -P xxxxxxxxxx
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocalDate=%%I"
set "LocalDate=%LocalDate:~0,8%"
copy /Y C:\test\csv\confirmed.csv C:\test\csvwithdates\confirmed-%LocalDate%.csv
set "LocalDate="

要了解使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
  • cd /?
  • copy /?
  • echo /?
  • for /?
  • set /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
  • 关于sql-server - 如何获取 Windows 批处理文件中的日期格式为 'yyyymmdd' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50566362/

    相关文章:

    sql - 访问两个数据库的 View

    sql - 确定 SQL Server View 中引用的表

    sql-server - SQL Server 错误错误代码 0xC0208449

    c++ - 应用于线程的延迟优先级更改

    java - 当前星期星期一日期

    php - Cyber​​Source - 商家定义的数据

    SQL:如何在多个列上选择一个表的公共(public)行

    windows - 如何在没有 Hyper-V 支持的 Windows 10 家庭版上安装 Vagrant?

    r - 列表数据框类上匹配日期的百分比计算

    c++ - shell_notifyicon : an attempt was made to reference a token that does not exist, 没有显示图标