Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将windows批处理文件中的日期格式设置为';yyyymmdd';?_Sql Server_Windows_Date_Batch File_Bcp - Fatal编程技术网

Sql server 如何将windows批处理文件中的日期格式设置为';yyyymmdd';?

Sql server 如何将windows批处理文件中的日期格式设置为';yyyymmdd';?,sql-server,windows,date,batch-file,bcp,Sql Server,Windows,Date,Batch File,Bcp,我正在编写一个Windows批处理文件,批处理文件应该输出特定文件夹中的文件。我希望文件名按如下方式编写: filename-yyyymmdd.csv 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 x

我正在编写一个
Windows
批处理文件,
批处理文件
应该输出特定文件夹中的文件。我希望文件名按如下方式编写:

filename-yyyymmdd.csv
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
其中yyyymmdd表示当前日期

我的
批处理文件
代码如下:

filename-yyyymmdd.csv
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

所需输出:
已确认-20180528.csv

我在
StackOverflow
上研究了以下问题,但我很难实现建议的答案:


我做错了什么?

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

因此,有必要在命令提示窗口
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%"
通过在命令提示窗口中运行命令,使用commandECHO而不是SET,可以很容易地找到需要替换的字符串:

echo %DATE%
echo %DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%
echo %DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%
另见

使用动态环境变量
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输出日期字符串的格式始终为yyymmddhhmmss.微秒±UTC偏移量(以分钟为单位)与配置的国家/地区以及为该国家/地区设置的日期格式无关

使用WMIC的缺点是执行所需的时间,因为它需要一秒钟以上的时间来输出日期字符串UTF-16 Little-Endian编码,然后由for的命令处理

有关这两个命令行如何在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/?
  • 复制/?
  • echo/?
  • 获取/?
  • 设置/?
  • wmic/?
  • wmic操作系统/?
  • wmic操作系统获取/?
  • wmic操作系统获取localdatetime/?

为什么要使用旧的
CMD
(已有20多年历史)批处理语法而不是Powershell?Powershell是所有Microsoft服务器产品的主要脚本接口。您可以从中使用eg
Invoke SqlCmd
来查询、格式化和导出数据。使用了20年的
cmd
语法从来没有打算执行复杂的字符串格式化。另一方面,Powershell中的字符串格式可以使用与.NET相同的字符串格式,使字符串操作更容易。例如
(获取日期).ToString('yyyyMMdd')
返回
20180528
(获取日期).ToString('o')
对于完整的ISO8601格式,您不应该尝试从
%date%
获取任何数据,因为它依赖于语言环境,并且可能因系统而异,甚至因用户而异。改用中的方法之一。从未尝试过Powershell。谢谢你的链接。我将详细介绍它,它似乎非常适合sql查询。我认为没有必要争论哪种方法获取日期更好,尤其是当它仅用于获取文件名的日期时。+1,尤其是,但不限于依赖于区域格式的
当前本地日期
——这一事实很容易被大多数人忽略。